20

我想在用户登录失败后显示一条消息,但我无法让变量显示在我的 Jade 视图中。

我有一些片段,我知道我必须在我的 app.configure() 中使用它:

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

我将设置用户 POSTS 错误密码后的 flash 消息:

     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 })
      )

我不知道如何访问res.locals.session我的 Jade 文件。我怀疑我是否设置正确。这个问题很像这个问题:Migrating Express.js 2 to 3, 特别是 app.dynamicHelpers() to app.locals.use? 但我仍然无法让它工作。如果有人可以向我展示一个在 res.local 中设置值并在视图中访问它们的简单示例,将不胜感激。

ps我确实知道connect-flash,但我需要了解如何使视图中的东西可用。

这是我的应用程序:

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)
)
4

2 回答 2

38

只是为了给每个有同样问题的人做一个简短的总结,并得到改变的印象res.redirect

app.use把你的中间件放在前面 很重要app.router。见 express 的作者 TJ Holowaychuck 的评论

这是一个使用全新安装 express v3.0.0rc4 的示例

应用程序.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
于 2012-09-26T08:37:48.300 回答
9

如果您使用的是 express.session(),则必须在express.session()之后但app.router 之前,在 app.configure() 内部调用您的函数。

应用程序.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')));
});

索引.jade

extends layout

block content   
  h1= title   
  p My req.session.var_name is set to #{session.var_name}
于 2013-03-05T18:44:51.780 回答