res query node bodyparser app javascript node.js express

javascript - query - express render html



¿Cuál es la diferencia entre establecer una propiedad en app.locals y llamar a app.set()? (4)

Estoy en el proceso de aprender Express y pensar en el mejor lugar para guardar datos de estilo de configuración. Las opciones disponibles están en app.locals o app.set (configuración) ... así que:

app.locals({ config: { name: ''My App'', domain: ''myapp.com'', viewPath: __dirname+''/views'', viewEngine: ''jade'' port: 3000 } }); app.set(''view engine'', app.locals.config.viewEngine || ''jade'');

Esto también me permitiría usar lo siguiente en mis vistas:

<title>#{config.name}</title> // <title>My App</title>

O la alternativa es usar app.set como tal:

app.set(''name'', ''My App''); app.set(''domain'', ''myapp.com'');

... y luego usar esto en la vista:

<title>#{settings.name}</title>

Sé que ambos métodos funcionan, pero estoy luchando para determinar cuál es el mejor método para usar. En este momento me estoy inclinando por usar app.locals, con el espacio de nombres ''app'' extra, ya que creo que habría menos posibilidades de conflictos con futuras actualizaciones y otros módulos si utilizara app.set.


La app.locals expresa dice:

Por defecto, Express expone solo una única variable local a nivel de aplicación, la configuración.

y de cualquier manera está bien:

app.locals.title = ''My App''; app.set(''title'', ''My App''); // use settings.title in a view


Mucha gente usa gente local en lugar de app.set, así que mi consejo es usar eso.


Todas las propiedades de app.locals están disponibles en plantillas. El uso de app.set asigna propiedades a app.locals.settings , que se usa para la configuración global de la aplicación y es heredado por las aplicaciones montadas. Por ejemplo:

var app1 = express(), app2 = express(); app1.set(''inheritable'', ''foo''); app1.locals.notInheritable = ''bar''; app1.use(''/mount'', app2); app2.get(''inheritable'') === ''foo''; // true app2.locals.notInheritable === ''bar''; // false

Así que es realmente una cuestión de preferencia y si estás montando aplicaciones.


Wow, todas las respuestas están mal, así que déjame intentarlo. A pesar de lo que otros dicen, aceptar el argumento app.local es diferente a usar app.set () . Reloj,

app.js app.locals.foo = ''bar''; app.set(''baz'', ''quz''); index.jade block content dl dt app.locals.foo = ''bar''; dd /#{settings.foo} = #{settings.foo} dd /#{foo} = #{foo} dt app.set(''baz'', ''quz'') dd /#{settings.baz} = #{settings.baz} dd /#{baz} = #{baz}

Si ejecuta este código, lo que vería es,

app.locals.foo = ''bar''; #{settings.foo} = #{foo} = bar app.set(''baz'', ''quz'') #{settings.baz} = quz #{baz} =

El motivo de esto es configurar app.locals establece los atributos del objeto que la vista usa como su entorno; Lo que la vista leerá desde sin calificar. Por el contrario, app.set establece atributos en app.locals.settings . Puedes verificar esto si app.locals.settings en lo anterior con app.locals.settings = {} , lo que hará que #{settings.baz} no esté definido.

Entonces, ¿cuál usas? Si no es una configuración de aplicación basada en la respuesta ( res.set ) o configuración global ( app.set ), use la escritura directa en app.locals .