回调内部的 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");
      });
}

会话状态在以下两种情况之一中保存 -

  1. 发送响应时(通过res.send、res.redirect等),

  2. 你手动调用req.session.save()