web-dev-qa-db-ja.com

express req.sessionオブジェクトはどのように永続化されますか?

NodeとExpressを学ぶのは初めてですが、コードフローをExpressで包み込もうとしています。session.jsに次のようなコードがあるとします。 :

app.post('/session', notLoggedIn, function(req, res) {
    User.findOne({
        username: req.body.username, 
        password: req.body.password
    }, function (err, user) {
        if (err) {
            return next(err);
        }
        if (user) {
            req.session.user = user;
            res.redirect('/users');
        } else {
            res.redirect('/session/new');
        }
    }); 
});

ユーザーが必須のmongoスキーマであると想定します。私が奇妙だと思うのは、session.userの割り当てです。

req.session.user = user;

リダイレクト後にreq変数はスコープ外になりますが、ユーザーデータを永続化するためにこれを行っていることは明らかなので、次のシナリオのどれが何が起こっているのかを理解する必要があります。 (A)reqパラメーターに割り当てられている引数(コールバックが呼び出されたとき)が保存されている/スタックのどこかにある、(B)セッションが保存されている/スタックにあり、新しいreqオブジェクトに割り当てられているコールバックに渡されるか、(C)Bと同じですが、ユーザーフィールドに渡されます(私の側ではありそうもないし、おそらく考案されたようです)。

17
NicholasFolk

すべてのセッション情報を格納する全体的なセッションデータ構造があります(グローバルのようですが、データベース内にある場合もあります-少なくとも接続間で永続的なものです)。各クライアントのセッションデータは、1つの一意のキーを使用してセッションストアにインデックスを付け、そのクライアントのセッションデータを取得します。

特定のブラウザクライアントのセッションを確立することの一部は、グローバルセッションオブジェクトへのインデックスとなる一意のクライアントキー(通常はCookieに保存されます)を作成することです。

着信httpリクエストで、セッションをサポートするExpressミドルウェアは特定のクライアントCookieをチェックし、その特定のCookieがhttpリクエストで見つかり、グローバルセッションオブジェクト/データベースで見つかった場合、そのセッションに保存されている情報をリクエストオブジェクトに追加しますhttpリクエストハンドラが後で使用するため。

それで、ここに典型的なシーケンスがあります:

  1. 着信HTTPリクエスト。
  2. ミドルウェアはセッションCookieをチェックします。
  3. セッションCookieがない場合は、Cookieを作成し、その過程でこのhttpクライアントを識別するための一意のIDを作成します。
  4. 永続セッションストアで、この新しいクライアントのセッションを初期化します。
  5. セッションCookieが存在する場合は、セッションストアでこのクライアントのセッションデータを探し、そのデータを要求オブジェクトに追加します。
  6. セッション終了ミドルウェア処理
  7. このhttpリクエストのExpress処理の後半で、一致するリクエストハンドラに到達します。この特定のhttpクライアントのセッションストアからのセッションデータは、すでにリクエストオブジェクトに添付されており、リクエストハンドラで使用できます。
14
jfriend00