回调中的快速会话在

时间:2015-07-13 22:50:08

标签: javascript node.js express request express-session

我有一条用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将返回undefined。然后检查 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的异步性质引起的,但我不确定。究竟是什么导致了这种情况,这是正确的解决方案吗?

2 个答案:

答案 0 :(得分: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");
      });
}

答案 1 :(得分:2)

会话状态保存在以下两个条件之一 -

  1. 发送回复时(通过res.send,res.redirect等),

  2. 您手动拨打req.session.save()