Экспресс-сессия внутри обратного вызова возвращается неопределенным снаружи
У меня есть маршрут, написанный в 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 возвращается как неопределенный. Проверка req.session.user внутри someFunction возвращается, однако, определенной. Решение, которое я нашел для сессии, ставшей неопределенной вне области 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, но я не уверен. Что именно вызывает это, и является ли это правильным решением?
2 ответа
Простейшим решением будет:
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");
});
}
Сеансовые состояния сохраняются в одном из двух условий:
Когда ответ отправлен (через res.send, res.redirect и т. Д.),
вы звоните вручную
req.session.save()