Экспресс-сессия внутри обратного вызова возвращается неопределенным снаружи

У меня есть маршрут, написанный в 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");
      });
}

Сеансовые состояния сохраняются в одном из двух условий:

  1. Когда ответ отправлен (через res.send, res.redirect и т. Д.),

  2. вы звоните вручную req.session.save()

Другие вопросы по тегам