我有一个函数,当她注册
时获取用户的id user.save(function(err, id){
if(err) return next(err);
req.session.uid=id;
})
然后,我写了这个中间件
var User = require('../user');//contains the code above
module.exports = function(req,res,next){
var uid = req.session.uid;
if(!uid) return next();//if not logged in
else{//else is logged in
User.get(uid, function(err, user){
//get user object and pass it to locals
if (err) console.log("error from midd > "+err);
req.user = res.locals.user = user;
next();
})
}
}
我在app.js
中定义了我的中间件,如此
var user = require('./lib/middleware/user');
app.use(session({resave:'false', saveUninitialized:'false', secret:'secret'}));
app.use(user); //<-- my middleware
app.use(express.static(path.join(__dirname, 'public')));
app.set('multimedia', __dirname + '/public/multimedia');
app.use(messages);
app.get('/register', register.form);
app.post('/register', register.submitit);
然后我检查当地人是否有身份证,并使用ejs显示正确的菜单
<%if (locals.user) {%>
<div id='menu'>
<a href='/post'>post</a>
<a href='/logout'>logout</a>
</div>
<%}else{ %>
<div id='menu'>
<a href='/login'>login</a>
<a href='/register'>sign up</a>
</div>
<%}%>
这永远不会奏效。在每个页面中,即使我已注册,我也从未看到注册用户的菜单(发布和注销)。
我在代码中放了很多console.log
,看起来中间件永远不会得到session.uid
。
console.log("req.session.uid = "+req.session.uid);
总是提供未定义的,即使保存用户工作并返回我传递给会话req.session.uid=id;
我该如何解决这个问题?请告知,因为我被卡住了。
由于
答案 0 :(得分:0)
注意:我无法确定这是您的错误,因为您没有粘贴代码user.save()
。但我完全相信这是原因。
Session.Save() :如果会话数据已被更改,则会在HTTP响应结束时自动调用此方法(尽管此行为可以更改为中间件构造函数中的各种选项)。因此,通常不需要调用此方法。
我在这里可以看到:
user.save(function(err, id){
if(err) return next(err);
req.session.uid=id;
})
你要么:
next(err)
(结束HTTP响应)继续此过程如果成功,您应该致电next()
或next(null)
。
因此,永远不会保存更改的会话(即:req.session.uid=id;
)。因此,导致检索中间件中的uid
失败。