2013-03-08 15 views
13

私は以下のそれぞれを使用するのが最善であるときを理解しようとしています。ここで私の初歩的な理解です:Express.js:app.locals vs req.locals vs req.session

app.locals - アプリケーションレベルでグローバル変数を格納するのに適しています。すべてのユーザー/セッションにこれらの変数の同じ値が表示されます。変数はすべてのビューで使用できます。

res.locals - 特定のリクエスト/応答サイクルの変数を格納するのに適しています。変数は応答に関連付けられたビューでのみ使用できます。

req.session - 一意のユーザーセッション(例:ユーザー名)に関連付けられた変数を格納するのに適しています。これらの変数は、一意のユーザー/セッションのすべてのビューで使用できる必要があります。

私が持っている具体的な使用例は次のとおりです。ユーザーは、mongodbからデータを取得するクエリを実行します。これで、json配列であるこのクエリの結果が、すべてのビュー(http要求)の変数として使用できるようになりました。それぞれのビューがアクセスできるように結果配列を「格納」する最良の方法は何ですか?

おかげ

+0

あなたはほとんど質問に自分で答えました。 req.localsは、現在の要求のビューで使用可能なデータ用です。 –

+4

は 'req.locals'ではなく' res.locals'です – Daniel

答えて

4

私は今、すべてのビューに変数として が利用可能にJSON配列であり、このクエリの結果を、したいです。 結果アレイを「格納」して、各ビューでアクセスできるようにするにはどうすればよいですか?

「すべてのビューで利用できる」と言えば、すべてのHTTPリクエストで同じと見なします。その場合、HTTPはステートレスなプロトコルであり、これを提供しないことに注意する必要があります。このために独自のメカニズムを開発する必要があります。

これを行う1つの方法は、この情報(配列)をサーバーにキャッシュし、すべての要求(たとえば、MongoDBではなくメモリから取得する)で取得することです。セッションIDをクッキーに保存し、このIDに基づいて、別のリクエストが来たときにキャッシュからフェッチします。情報をメモリに格納するために選択できるいくつかのキャッシュツール(例えば、redis、memcachedなど)があります。

また、この情報(配列自体)をクッキーすることもできます。その場合は、HTTP要求ごとにクライアントとサーバーの間を行き来し、データがない限りは非常に良いアイデアにはなりません非常に少ない。

+1

'app.locals'にデータを格納し、複数のNodeプロセスを実行しない場合(つまり、' cluster'を使用しない場合)、それは要求全体であっても、すべてのビューで使用できるようになります。 – robertklep

+0

@robertklep - これは元々はapp.localsにデータを格納していましたが、HTTPリクエストを出している2台のPCでテストを実行し、両方が同じデータを見ました!私はクライアント間でデータを共有したくありません。 –

+2

クエリをトリガーしたユーザーのみが、すべてのビューでそれらを使用できるようにしますか? 'req.session'を使用してください(あなたの質問ではあなた自身で既に回答しています;-) – robertklep