在Express中使用中间件设置res.locals并不会在每个请求中传递?

时间:2016-09-08 05:53:58

标签: javascript node.js express handlebars.js

我正在使用快递,节点和把手创建一个Web应用程序,护照是身份验证库。我试图在res.locals中设置一个变量,以根据用户状态呈现导航栏。我遇到的问题是,当使用中间件设置res.locals.isUserres.locals.isAdmin时,变量似乎不会传递或至少看起来不是。代码如下(为简单起见而淡化)。

app.js

var app = require('express)();

app.use(function(req, res, next){
   res.locals.isUser = false;
   if(req.user && req.user.role === 'user'){
      res.locals.isUser = true;
   }

   next();
});

// Admin logic same as above but isAdmin instead of isUser

var passport =  require('./lib/auth/passport.js')(app);

require('./routes.js');

layout.handlebars

 {{#if isUser}}
     {{> userNav}}
 {{else if isAdmin}}
     {{> adminNav}}
 {{else}}
     <nav>
         // Render normal nav
     </nav>
 {{/if}}

 {{{body}}}

当用户登录导航栏更改时会发生什么,但是当用户退出时,导航栏有时会保持为{{> userNav}}。刷新页面似乎可以解决问题。此外,一旦用户退出,并且导航栏保持为{{> userNav}},单击导航栏中的链接会将我发送到404.这向我保证护照注销机制正常工作。我在中间件中放置了一个console.log('...'),以确定是否在每个请求上都调用它,而且确实是这样。我将中间件移到routes.js文件中,问题仍然存在。我绞尽脑汁,不知道为什么会这样。它似乎在几天前工作正常,或者至少我以前从未注意过这个问题。难道我做错了什么?任何帮助将不胜感激。谢谢大家!

使用...

  • 快速
  • 快速车把
  • 护照
  • MongoDB的

一些相关的帖子......

Why is PassportJS in Node not removing session on logout

Express+jade: local variable not available in view

1 个答案:

答案 0 :(得分:0)

当我看到您退出时,您没有为isUser发送任何值 这就是为什么在sessionpassport关闭时您的视图未更新,但是当您刷新页面时,您会得到false isUser的值。

  

注销后重定向时需要传递isUser值。

你需要做这样的事情

res.redirect(303, '/?isuser='+false)

收到logout的回复后,更新isuser

中的view

希望这能解决您的问题