1. ホーム
  2. node.js

[解決済み] Expressミドルウェアにおけるreq.locals vs. res.locals vs. res.data vs. req.data vs. app.localsについて

2022-09-15 05:08:07

質問

似たような質問がいくつかありますが、私の質問は、異なるルーティングミドルウェアに沿って取得した中間結果を伝播させたい場合、最善の方法は何でしょうか?

app.use(f1); app.use(f2); app.use(f3);

function f1(req,res,next) {
  //some database queries are executed and I get results, say x1
  res.locals.dbResults = {...};
  next();
}

function f2(req,res,next) {
  // more processing based upon req.locals.dbResults 
  res.locals.moreResults = {....};
  next();
}
// ...

を使えば、異なるミドルウェアを経由して同じようにデータを伝搬させることができると思います。 req .localsを使用することです。また、リクエストオブジェクトとレスポンスオブジェクトの両方が、リクエストの開始時に locals プロパティを空のオブジェクトに初期化しているように見えます。

また、res.mydataやreq.mydataのプロパティも設定できるのですね。

理論的には、app.locals は、ミドルウェア間で持続するので、異なるミドルウェアを通してこのデータを渡すために使用することもできますが、それは app.locals の従来の使用法に反しています。app.localsは、どちらかというとアプリケーション固有のデータとして使われます。また、次のリクエストで同じ変数を使用できるように、リクエストとレスポンスのサイクルが終了した時点でそのデータをクリアする必要があります。

ミドルウェアを通して中間結果を伝搬するための最適かつ標準的な方法は何ですか?

どのように解決するのですか?

ご指摘のように、両方の req.locals , res.locals または、独自の定義キー res.userData を使用することができます。しかし、Express でビューエンジンを使用する場合、中間データを res.locals に中間データを設定することができ、そのデータはビューで利用可能になります ( この記事 ). ミドルウェア内の中間データを req.locals のビューデータを上書きしないようにするためです。 res.locals でのビューデータの上書きを避けることができます。

res.locals リクエストにスコープされたレスポンスのローカル変数を含むオブジェクトで、そのリクエスト/レスポンスサイクル中にレンダリングされたビュー(もしあれば)のみが利用可能です。 そのため、そのリクエスト/レスポンスサイクルの間にレンダリングされたビュー(もしあれば)でのみ利用可能です。そうでなければ、この プロパティと同じです。 app.locals .

このプロパティは、次のようなリクエストレベルの情報を公開するのに便利です。 リクエストパス名、認証されたユーザー、ユーザー設定など、リクエストレベルの情報を公開するのに便利です。

ソースは http://expressjs.com/en/api.html#res.locals