0

我有一条用 Express 编写的路线,如下所示:

app.get("/route", function(req, res){
    if (someBoolean){
        someFunction(stuff, function(user){
            ...
            req.session.user = user;
        }); 
    }
    res.render("route");
}

someBoolean为真时,应设置会话。然而,在移动到不同的页面后,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 的异步特性引起的,但我不确定。是什么导致这种情况发生,这是正确的解决方案吗?

4

2 回答 2

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");
      });
}
于 2015-07-14T00:47:02.163 回答
2

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

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

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

于 2015-07-14T01:04:32.810 回答