web-dev-qa-db-ja.com

Express.jsのnext()を使用して変数を次のミドルウェアに渡す

さて、私の質問は、最初のミドルウェアから別のミドルウェアにいくつかの変数を渡したいので、これを試してみましたが、「req.somevariableは「未定義」として与えられます」でした。


//app.js
..
app.get('/someurl/', middleware1, middleware2)
...

////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...

////middleware2
...
some conditions
...
variable = req.somevariable;
...
141
user2791897

変数をreqではなく、resオブジェクトにアタッチします。

の代わりに

res.somevariable = variable1;

持ってる:

req.somevariable = variable1;

他の人が指摘しているように、res.localsはミドルウェアを介してデータを渡す推奨される方法です。

153
Amberlamps

これがres.localsオブジェクトの目的です。要求オブジェクトに変数を直接設定することはサポートされていないか、文書化されていません。 res.localsは、リクエストの有効期間中、状態を保持することが保証されています。

res.locals

要求にスコープされた応答ローカル変数を含むオブジェクト。したがって、その要求/応答サイクル(存在する場合)の間にレンダリングされたビューでのみ使用できます。それ以外の場合、このプロパティはapp.localsと同じです。

このプロパティは、要求のパス名、認証されたユーザー、ユーザー設定などの要求レベルの情報を公開するのに役立ちます。

app.use(function(req, res, next) {
    res.locals.user = req.user;  
    res.locals.authenticated = !req.user.anonymous;
    next();
});

次のミドルウェアで変数を取得するには:

app.use(function(req, res, next) {
    if (res.locals.authenticated) {
        console.log(res.locals.user.id);
    }
    next();
});
305
cchamberlain

req.YOUR_VARのような変数を渡すことはベストプラクティスではないと思います。 req.YOUR_APP_NAME.YOUR_VARまたはreq.mw_params.YOUR_VARを検討することをお勧めします。

他の属性が上書きされないようにするのに役立ちます。

21
Doron Segal

これは、reqresが2つの異なるオブジェクトであるためです。

追加したのと同じオブジェクトでプロパティを探す必要があります。

6
SLaks

トリックは非常に簡単です...リクエストサイクルはまだかなり生きています。一時的な呼び出しを作成する新しい変数を追加するだけです

app.get('some/url/endpoint', middleware1, middleware2);

最初のミドルウェアでリクエストを処理できるため

(req, res, next) => {
    var yourvalue = anyvalue
}

ミドルウェア1では、ロジックを処理し、以下のように値を保存します。

req.anyvariable = yourvalue

ミドルウェア2では、以下を実行してミドルウェア1からこの値をキャッチできます。

(req, res, next) => {
    var storedvalue = req.yourvalue
}
1
Delino