在Jade视图中检查会话变量

5

我正在使用NodeJS、ExpressJS、PassportJS和Jade。

我有一个头部菜单,将显示登录或登出。如果用户尚未登录,则显示登录,并且如果用户已经登录,则显示登出。

该菜单在单独的jade文件menu.jade中,包含在其他jade文件中。

include menu

在menu.jade中,我怎样才能检查用户是否已登录?我可以在jade中检查会话变量吗?类似下面的menu.jade的内容?
if ( req.session.name != null)
    a(href='/logout') Logout
else
    a(href='/login') Login  

谢谢

2个回答

8
你需要将会话暴露给模板。我通常的做法是将用户变量放入本地环境中:
注意:req.user由passportJS设置,你可以在这里(底部)看到他们的示例。 注意2:更多关于本地环境的信息这里
app.get('*', function(req, res, next) {
  // put user into res.locals for easy access from templates
  res.locals.user = req.user || null;

  next();
});

然后在模板中你可以这样做:

- if(_user) {
    div.menuForLoggedInUser
- } else {
    div.menuForLoggedOutUser
- }

如果您不想将整个用户对象暴露给模板,可以只将“loggedIn”放入本地变量中并进行检查... 然后类似于这样:

app.get('*', function(req, res, next) {
  // just use boolean for loggedIn
  res.locals.loggedIn = (req.user) ? true : false;

  next();
});

编辑:感谢robertklep指出了res.locals和app.locals的区别。


1
我相信你在渲染视图时也需要将app.locals作为locals暴露出来。(Node.js和Express通常避免“魔法”) - Timothy Meade
我的实现确实有点缺陷。应该是 app.locals({}) 而不是 app.locals = {}(正如 expressJS 文档所述)。 - Henrik Peinar
1
app.locals 是一个应用程序范围的存储空间,你不应该使用它来存储动态数据,比如 req.user(因为其他请求可能会覆盖它)。相反,应该使用 res.locals - robertklep
2
我认为你打错了一个字母,应该写if(user)而不是if(_user) - hiteshtr

1
我会带来一个变量,用于检查登录状态。
// routes/some.js
exports.index = function (req, res) {
    res.render('somepage', {
        isAlreadyLoggedin: checkSessionSomeway()
    })
}

// menu.jade
if ( isAlreadyLoggedin != null)
    a(href='/logout') Logout
else
    a(href='/login') Login

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接