web-dev-qa-db-ja.com

Expressミドルウェアのreq.locals vs. res.locals vs. res.data vs. req.data vs app.locals

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

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の従来の使用に反します。アプリケーション固有のデータにより多く使用されます。同じ変数を次の要求に使用できるように、要求と応答のサイクルの終わりにそのデータをクリアする必要もあります。

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

52
Sunny

すでに述べたように、req.localsres.locals、または独自に定義したキーres.userDataの両方を使用できます。ただし、Expressでビューエンジンを使用する場合、ミドルウェアのres.localsに中間データを設定でき、そのデータをビューで使用できます( この投稿 を参照)。公式には文書化されていませんが、req.localsのビューデータの上書きを避けるために、res.localsのミドルウェア内に中間データを設定するのが一般的な方法です。

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

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

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

109
xaviert