ExpressJS 3.0 ¿Cómo pasar res.locals a una vista de jade?

Quiero mostrar un mensaje flash después de que un usuario no pueda iniciar sesión, pero simplemente no puedo ver las variables para que aparezcan en mis vistas de Jade.

Tengo algunas piezas, sé que tengo que usar esto en mi app.configure ():

app.use (req, res, next) -> res.locals.session = req.session 

Y estableceré cuál es el mensaje flash después de que el usuario PIDE la contraseña incorrecta:

  exports.postSession = (req, res) -> users = require '../DB/users' users.authenticate(req.body.login, req.body.password, (user) -> if(user) req.session.user = user res.redirect(req.body.redirect || '/') else req.session.flash = 'Authentication Failure!' res.render('sessions/new', {title:'New', redirect: req.body.redirect }) ) 

No sé cómo acceder a res.locals.session en mi archivo Jade. Dudo que esté arreglando todo bien. Esta pregunta es muy parecida a esta: Migrar Express.js 2 a 3, específicamente app.dynamicHelpers () a app.locals.use? Pero todavía no puedo hacerlo funcionar. Se agradecería que alguien me mostrara un simple ejemplo de configuración de valores en res.local y acceso a ellos en una vista.

PD: sí sé acerca de Connect-Flash pero necesito entender cómo hacer que las cosas estén disponibles en las vistas.

Esta es mi aplicación:

 app.configure(() -> app.set('views', __dirname + '/views') app.set('view engine', 'jade') app.use(express.bodyParser()) app.engine('.jade', require('jade').__express) app.use(express.methodOverride()) app.use(express.cookieParser()) app.use(express.session({ store: new express.session.MemoryStore({reapInterval: 50000 * 10}), secret: 'chubby bunny' })) app.use(express.static(__dirname + '/public')) app.use((req, res, next) -> res.locals.session = req.session next() ) app.use(app.router) ) 

Solo para dar un breve resumen para todos los que tengan el mismo problema y tengan la impresión de que se resolvió cambiando res.redirect .

Es muy importante poner su middleware app.router antes que app.router . Vea los comentarios de TJ Holowaychuck, el autor de Express.

Aquí hay un ejemplo usando una instalación nueva de Express v3.0.0rc4

app.js:

 app.use(function(req, res, next){ res.locals.variable = "some content"; next(); }) app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); }); 

index.jade:

 extends layout block content h1= title p Welcome to #{title} p= variable 

Si está utilizando express.session (), debe llamar a su función DESPUÉS de express.session () pero ANTES de app.router , dentro de app.configure ().

app.js

 app = express(); app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.session()); // Give Views/Layouts direct access to session data. app.use(function(req, res, next){ res.locals.session = req.session; next(); }); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); }); 

index.jade

 extends layout block content h1= title p My req.session.var_name is set to #{session.var_name}