【问题标题】:Express session inside callback comes back undefined outside回调内部的快速会话在外部返回未定义
【发布时间】:2015-07-14 09:04:32
【问题描述】:

我有一条用 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 的异步特性引起的,但我不确定。是什么导致这种情况发生,这是正确的解决方案吗?

【问题讨论】:

  • 可以发someFunction的内容吗?这对于确定 Node 的异步特性是否导致此问题实际上很重要。
  • 我现在没有确切的代码,但是 someFunction 涉及从数据库写入/读取,所以这就是为什么我认为它一定是由 Node 的异步性质引起的。跨度>
  • 是的,这正是它读取/写入数据库的原因。您必须在回调方法中完成 db 调用后执行您希望发生的任何操作,以确保事件按顺序发生。

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


【解决方案1】:

最简单的解决方案是:

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");
      });
}

【讨论】:

  • 您的第一个示例符合我的要求。我花了一段时间才找到,所以我在这里输入我的问题,这样其他人可能会比我更快地找到它:“如何将数据从具有回调的函数传递到快速路由器”。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多