¿Migrar Express.js 2 a 3, específicamente app.dynamicHelpers () a app.locals.use?

Se actualizó Express.js de la versión 2 a 3, y se app.dynamicHelpers({..}) la siguiente llamada a app.dynamicHelpers({..}) porque ya no está presente en V3:

 app.dynamicHelpers({ request: function(req){ return req }, ...etc. }); 

Hay una guía de migración que dice esto:

  • app.dynamicHelpers() (usa middleware + res.locals)

Pero estoy perplejo de cómo hacer eso. ¿Hay un ejemplo más concreto de cómo migrar eso?

Publicación de SO relacionada: nodejs express 3.0

Tuve el mismo problema con session.user y lo arreglé entendiendo que la función app.use debe estar EN la parte de configuración, no donde estaba antes.

Antes de:

 app.configure(); app.dynamicHelpers({ user: function(req, res) { return req.session.user; } }); 

Después:

 app.configure(function(){ //... app.use(function(req, res, next){ res.locals.user = req.session.user; next(); }); //... }); 

Para Flash echa un vistazo a Connect-Flash

La solución con 16 votos es correcta, pero asegúrese de usar la asignación app.use(app.router); antes de app.use(app.router); consulte esta publicación https://stackoverflow.com/a/12597730/1132109

reponse.locals.use es una nueva característica útil de Express que le permite enviar una variable a su modelo que primero necesita ser evaluada. Digamos, por ejemplo, que desea enviar 3 variables a su vista, todas las cuales deben venir después de una solicitud a un mongodb. La forma “antigua” era anidar 3 devoluciones de llamada, y cuando se devolviera la última, representaría su vista. locals.use hace que esto sea mucho más fácil ya que evaluará sus funciones y representará su vista solo cuando todas hayan sido evaluadas.

Aquí hay un breve fragmento de código sobre cómo usarlos (esto es café-script, espero que puedas convertirlo a javascript: D)

 response.locals.use (request, response, done) -> myAsynchMethod (value) -> reponse.locals.myProperty = value done() 

En este caso, habrá una variable llamada myProperty que puede usar en su vista que tiene su valor establecido en lo que sea que myAsynchMethod haya devuelto la callback.

Echa un vistazo a la carpeta de ejemplos en github. Por ejemplo, auth :

 app.use(function(req, res, next){ var err = req.session.error, msg = req.session.success; delete req.session.error; delete req.session.success; res.locals.message = ''; if (err) res.locals.message = '

' + err + '

'; if (msg) res.locals.message = '

' + msg + '

'; next(); });

Luego puede usar la variable “mensaje” en su plantilla.