我正在使用快递,节点和把手创建一个Web应用程序,护照是身份验证库。我试图在res.locals
中设置一个变量,以根据用户状态呈现导航栏。我遇到的问题是,当使用中间件设置res.locals.isUser
或res.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
文件中,问题仍然存在。我绞尽脑汁,不知道为什么会这样。它似乎在几天前工作正常,或者至少我以前从未注意过这个问题。难道我做错了什么?任何帮助将不胜感激。谢谢大家!
使用...
一些相关的帖子......
答案 0 :(得分:0)
当我看到您退出时,您没有为isUser
发送任何值
这就是为什么在session
被passport
关闭时您的视图未更新,但是当您刷新页面时,您会得到false
isUser
的值。
注销后重定向时需要传递
isUser
值。
你需要做这样的事情
res.redirect(303, '/?isuser='+false)
收到logout
的回复后,更新isuser
view
值
希望这能解决您的问题