0

次のように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 の非同期性が原因であると考えていますが、よくわかりません。これが正確に発生する原因は何ですか?これは適切な解決策ですか?

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

セッション状態は、次の 2 つの条件のいずれかで保存されます。

  1. 応答が送信されると (res.send、res.redirect などを介して)、

  2. 手動で呼び出すreq.session.save()

于 2015-07-14T01:04:32.810 に答える