Node.js 检查Jade视图中的会话变量

Node.js 检查Jade视图中的会话变量,node.js,express,pug,passport.js,Node.js,Express,Pug,Passport.js,我使用NodeJS、ExpressJS、PassportJS和Jade 我有一个标题菜单,将显示登录或注销。如果用户尚未登录,则显示Login;如果用户已登录,则显示Logout // routes/some.js exports.index = function (req, res) { res.render('somepage', { isAlreadyLoggedin: checkSessionSomeway() }) } // menu.jade if

我使用NodeJS、ExpressJS、PassportJS和Jade

我有一个标题菜单,将显示登录或注销。如果用户尚未登录,则显示Login;如果用户已登录,则显示Logout

// 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
菜单位于单独的jade文件中:
菜单。jade
包含在其余的jade文件中

include menu
在menu.jade中,如何检查用户是否已登录?我可以检查jade中的会话变量吗?类似于下面的
菜单。jade

if ( req.session.name != null)
    a(href='/logout') Logout
else
    a(href='/login') Login  

谢谢

您需要向模板公开会话。我这样做的方式是将我的用户变量放入局部变量:

注意:req.user由passportJS设置,您可以从
注#2:关于本地人的更多信息

然后在模板中,您可以执行以下操作:

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

编辑:感谢您指出res.locals与app.locals的区别

我将为签入带来结果变量

// 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

我认为,在渲染视图时,还需要将app.locals作为本地人公开。(node.js和express大多避免使用“magic”)我的实现确实有点缺陷。而不是app.locals={};它应该是app.locals({});(正如expressJS文档所述)
app.locals
是应用程序范围的存储,您不应该使用它来存储动态数据,如
req.user
(因为其他请求可能会覆盖它)。改用。我想你只打了一次错,写
if(user)
而不是
if(\u user)