さて、私の質問は、最初のミドルウェアから別のミドルウェアにいくつかの変数を渡したいので、これを試してみましたが、「req.somevariable
は「未定義」として与えられます」でした。
//app.js
..
app.get('/someurl/', middleware1, middleware2)
...
////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...
////middleware2
...
some conditions
...
variable = req.somevariable;
...
変数をreq
ではなく、res
オブジェクトにアタッチします。
の代わりに
res.somevariable = variable1;
持ってる:
req.somevariable = variable1;
他の人が指摘しているように、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();
});
req.YOUR_VAR
のような変数を渡すことはベストプラクティスではないと思います。 req.YOUR_APP_NAME.YOUR_VAR
またはreq.mw_params.YOUR_VAR
を検討することをお勧めします。
他の属性が上書きされないようにするのに役立ちます。
これは、req
とres
が2つの異なるオブジェクトであるためです。
追加したのと同じオブジェクトでプロパティを探す必要があります。
トリックは非常に簡単です...リクエストサイクルはまだかなり生きています。一時的な呼び出しを作成する新しい変数を追加するだけです
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
}