我有一条用Express编写的路线如下:
app.get("/route", function(req, res){
if (someBoolean){
someFunction(stuff, function(user){
...
req.session.user = user;
});
}
res.render("route");
}
当 someBoolean 为true时,应设置会话。但是,在转到另一个页面后,req.session.user将返回undefined。然后检查 someFunction 中的req.session.user。我发现会话在 someFunction 范围之外未定义的解决方案是将res.render(“route”)移动到 someFunction 中:
app.get("/route", function(req, res){
if (someBoolean){
someFunction(stuff, function(user){
...
req.session.user = user;
res.render("route");
});
}
}
但是当 someBoolean 为false时,这会导致路由失败。我认为这是由Node.js的异步性质引起的,但我不确定。究竟是什么导致了这种情况,这是正确的解决方案吗?
答案 0 :(得分:3)
最简单的解决方案是:
app.get("/route", function(req, res){
if (someBoolean){
someFunction(stuff, function(user){
...
req.session.user = user;
res.render("route");
});
}else{
res.render("route");
}
}
使用承诺你可以这样做(首先你宣传someFunction
):
app.get("/route", function(req, res){
Promise.resolve()
.then(function(){
if(someBoolean){
return someFunction(stuff)
.then(function(user){
res.session.user = user;
});
}
}).then(function(){
res.render("route");
});
}
答案 1 :(得分:2)
会话状态保存在以下两个条件之一 -
发送回复时(通过res.send,res.redirect等),
您手动拨打req.session.save()