回调内部的 Express session 在外部返回 undefined
Express session inside callback comes back undefined outside
我有一个用 Express 写的路由如下:
app.get("/route", function(req, res){
if (someBoolean){
someFunction(stuff, function(user){
...
req.session.user = user;
});
}
res.render("route");
}
当someBoolean为真时,应该设置session。然而,在转到另一个页面后,req.session.user 返回为未定义。然而,在 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 的异步性质引起的,但我不确定。究竟是什么原因导致这种情况发生,这是正确的解决方案吗?
最简单的解决方案是:
app.get("/route", function(req, res){
if (someBoolean){
someFunction(stuff, function(user){
...
req.session.user = user;
res.render("route");
});
}else{
res.render("route");
}
}
使用 promises 你可以这样做(首先你 promisify 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");
});
}
会话状态在以下两种情况之一中保存 -
发送响应时(通过res.send、res.redirect等),
你手动调用req.session.save()
我有一个用 Express 写的路由如下:
app.get("/route", function(req, res){
if (someBoolean){
someFunction(stuff, function(user){
...
req.session.user = user;
});
}
res.render("route");
}
当someBoolean为真时,应该设置session。然而,在转到另一个页面后,req.session.user 返回为未定义。然而,在 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 的异步性质引起的,但我不确定。究竟是什么原因导致这种情况发生,这是正确的解决方案吗?
最简单的解决方案是:
app.get("/route", function(req, res){
if (someBoolean){
someFunction(stuff, function(user){
...
req.session.user = user;
res.render("route");
});
}else{
res.render("route");
}
}
使用 promises 你可以这样做(首先你 promisify 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");
});
}
会话状态在以下两种情况之一中保存 -
发送响应时(通过res.send、res.redirect等),
你手动调用
req.session.save()