2016-05-28 6 views
2

Ich versuche Daten (höchstwahrscheinlich ein Objekt) zu speichern, so dass es für meine gesamte Anwendung zugänglich ist. Zum Beispiel Informationen über meinen aktuell angemeldeten Benutzer (Benutzer-ID und Name).Was ist der beste Weg, um globale Objekte mit NodeJS und ExpressJS zu speichern

Ich frage mich, was der effizienteste Weg ist, dies in Node und Express zu tun?

Nach ein paar Recherchen fand ich ein paar Wege, obwohl die meisten schien ganz unorthadox wie globale Objekte (global.myuser = {}).

Ich fand auch, dass ich ein Objekt als ein Modul speichern und es dort einschließen konnte, wo ich es brauche, obwohl ich nicht sicher bin, ob Daten mit dieser Methode bestehen bleiben.

Was wäre der beste Ansatz dafür?

Antwort

3

Lassen Sie ein Modul die Daten für Sie und dann require() in diesem Modul verwalten, wo immer Sie darauf zugreifen möchten. require() ist im Cache gespeichert, so dass nachfolgende Aufrufe zu Ihnen jedes Mal das gleiche Modul zurückbekommen, was gut für gemeinsame Daten funktioniert, ohne global zugängliche Variablen zu verwenden und gleichzeitig eine ordnungsgemäße Abhängigkeitsverwaltung aufrechtzuerhalten (Globals sind in node.js generell böse, weil sie nicht angezeigt werden) Abhängigkeiten überhaupt).

Bitte beachten Sie, dass global zugängliche Daten in node.js von Anfragen von allen Benutzern gemeinsam genutzt werden, es sei denn, Sie machen sie nur für einige Benutzer verfügbar. Eine Variable wie global.myuser klingt also verdächtig gefährlich, es sei denn, die myuser ist ein Serverbenutzer (etwas, von dem es nur einen gibt), kein tatsächlicher Benutzer von einer Anfrage.

Hier ist ein einfaches Beispiel:

// shared_data.js 
var myData = {someKey: 12345678}; 

module.exports = myData; 

Dann in anderen Modulen:

var sharedData = require('./shared_data.js'); 

// you can access the sharedData object here 

Wenn Sie versuchen, eingeloggte Benutzer erinnern, dann müssen Sie ein beteiligtes System Dazu gehört das Verfolgen eines bestimmten Benutzers über ein Login-Cookie-Token und das Speichern gültiger Login-Token auf dem Server, bei denen verschiedene Anfragen prüfen können, ob der Benutzer tatsächlich angemeldet ist.

Für eingeloggte Benutzer mit Express, würde ich vorschlagen express-session als es 90% der Arbeit für Sie. Sie erhalten ein Objekt für jeden angemeldeten Benutzer, in dem Sie alles speichern können, was Sie möchten, und diese Information wird direkt nur mit diesem Benutzer korreliert.

Das Sitzungsobjekt für den aktuellen Benutzer wird bei einer eingehenden Anfrage automatisch im Objekt request verfügbar sein. Und Sie können dieses Sitzungsobjekt an jede andere Funktion übergeben, die Sie in einer Anfrage aufrufen möchten.

+0

Ja, sie werden in Benutzer angemeldet sein. Ich möchte, dass der Server weiß, zu welchem ​​Benutzer er Daten sendet, sodass ich seine ID über meinen MongoDB-Aufruf einbeziehen kann, um Daten zurückzuholen, die nur für sie relevant sind.Es kam mir sogar gar nicht in den Sinn, dass ich die globalen Daten speichern würde, aber das wäre für alle Benutzer dasselbe. Was wäre, wenn ich einen Ansatz wie das 'express-sessions'-Paket verwende? – Fizzix

+0

Siehe meine Antwort zum Speichern der Daten pro Benutzer: http://Stackoverflow.com/a/37504339/1229624 – Aminadav

+0

Ich würde die Verwendung von Express-Sitzung empfehlen. Sehen Sie, was ich meiner Antwort hinzugefügt habe. – jfriend00

2

Sie können global nicht zum Speichern des aktuell angemeldeten Benutzers verwenden. Das Problem ist, dass alle Benutzer die gleiche global haben. So Gast-Benutzer haben Zugang zu admin Seiten.

Wenn Sie Daten zwischen Express-Modulen austauschen müssen, können Sie der Variablen request Anthing hinzufügen.

app.get('*',function(req,res){ 
    req.firstRoute=true 
    req.currentUser=30 
}) 
app.get('/othertoure',function(req,res){ 
    console.log(req.firstRoute) // = true 
    console.log(req.currentUser) // = 30 
}) 
+0

Das OP scheint, Daten für einen eingeloggten Benutzer über Anfragen pro Benutzer zu speichern. Ich sehe nicht, wie dies erreicht wird das. – jfriend00

+0

Er sagte nicht, dass er will, dass es über Anfragen funktioniert. Er sagte 'ganze app'. Jede Anfrage, er sollte Validierung, und fügen Sie die Benutzerdaten zum' req' Objekt. Danach kann er zugreifen die Daten in der gesamten App (andere Routen), bis die Anfrage beendet wurde – Aminadav

Verwandte Themen