2013-03-08 4 views
13

Ich versuche zu verstehen, wenn es am besten ist, jeden der folgenden zu verwenden. Hier ist mein rudimentäres Verständnis:Express.js: app.locals vs req.locals vs req.session

app.locals - gut zum Speichern globaler Variablen auf App-Ebene. Alle Benutzer/Sitzungen sehen die gleichen Werte für diese Variablen. Die Variablen sind für alle Ansichten verfügbar.

res.locals - gut zum Speichern von Variablen für den spezifischen Anfrage/Antwort-Zyklus. Die Variablen sind nur für die Ansicht verfügbar, die der Antwort zugeordnet ist.

req.session - gut zum Speichern von Variablen, die mit der eindeutigen Benutzersitzung verknüpft sind (z. B. Benutzername). Diese Variablen sollten für alle Ansichten für den eindeutigen Benutzer/die einzige Sitzung verfügbar sein.

Der spezifische Anwendungsfall, den ich habe, ist wie folgt: Ein Benutzer führt Abfrage aus, die Daten von mongodb abruft. Ich möchte nun das Ergebnis dieser Abfrage, die ein JSON-Array ist, als Variable für ALLE Ansichten (http-Anfragen) verfügbar machen. Was ist der beste Weg, um das Ergebnis-Array zu "speichern", so dass jede Ansicht darauf zugreifen kann?

Dank

+0

Sie haben die Frage ziemlich selbst beantwortet. req.locals ist für Daten, die in den Sichten für die aktuelle Anfrage verfügbar sein sollen. –

+4

ist 'res.locals', nicht' req.locals' – Daniel

Antwort

4

Ich möchte nun das Ergebnis dieser Abfrage, die ein JSON-Array ist, verfügbar als Variablen zu allen Ansichten. Was ist die beste Möglichkeit, das Ergebnis-Array zu "speichern", so dass jede Ansicht darauf zugreifen kann?

Wenn Sie "für alle Ansichten verfügbar" sagen, nehme ich an, Sie meinen über alle HTTP-Anfragen. Wenn dies der Fall ist, müssen Sie beachten, dass HTTP ein Stateless-Protokoll ist und dies nicht vorsieht. Sie müssen dafür einen eigenen Mechanismus entwickeln.

Eine Möglichkeit besteht darin, diese Informationen (das Array) auf dem Server zwischenzuspeichern und bei jeder Anforderung abzurufen (z. B. aus dem Speicher und nicht aus MongoDB). Sie speichern eine Sitzungs-ID auf dem Cookie und holen diese basierend auf dieser ID aus dem Cache, wenn eine andere Anforderung durchkommt. Es stehen mehrere Cache-Tools zur Verfügung (z. B. redis, memcached usw.), die Sie zum Speichern der Informationen im Speicher auswählen können.

Sie könnten auch diese Informationen cookie (das Array selbst) in diesem Fall wird es zwischen dem Client und dem Server bei jeder HTTP-Anfrage hin und her gesendet werden und sehr wahrscheinlich keine sehr gute Idee, es sei denn, die Daten sind sehr klein.

+1

Wenn Sie die Daten in 'app.locals' speichern und nicht mehr als einen Node-Prozess ausführen (dh Sie verwenden' cluster' nicht), dann ist es wird für alle Ansichten verfügbar sein, auch über Anfragen hinweg. – robertklep

+0

@robertklep - das ist, was ich ursprünglich getan habe, speicherte die Daten in app.locals, aber dann lief ich Test mit zwei PCs HTTP-Anfragen machen und sie sahen beide die gleichen Daten! Ich möchte die Daten nicht zwischen Clients teilen. –

+2

Sie möchten also, dass sie in allen Ansichten verfügbar sind, aber nur für den Benutzer, der die Abfrage ausgelöst hat? Benutze 'req.session' (nochmal, in deiner Frage antwortest du schon selbst ;-) – robertklep