2017-01-09 6 views
0

In meiner Chat-Anwendung NodeJS und socket.io verwenden, muss ich variabel über verschiedene Module teilen, so dass der Wert auf eine Datei geändert sollte von anderen Datei zugegriffen werden. Ein Workflow meiner App ist wie folgt. NodeJS Austausch von variablen accross verschiedenen Modulen

Im Haupt app.js ich einen Controller-Datei enthalten sind, für die Authentifizierung „users.js“, in dem ich eine Variable verwenden, sagen wir zum Beispiel var = online {}; Bei jeder Anmeldung wird der Wert in diese Variable eingefügt. Für die Behandlung von Socket-Chat habe ich eine andere Controller-Datei namens chat.js verwendet, in der ich dieselben variablen Online-Benutzer verwenden muss.

Betrachten wir nun 3 Dateien app.js, user.js, chat.js

In app.js 
var users = require('./users.js'); 
var chat = require('./chat.js'); 
users.set(app); 
chat.set(app,io); 


In user.js 

module.exports.set = function(app) { 
// var onlineusers modified in some function 
} 

In chat.js 

module.exports.set = function(app,io) { 
// var onlineusers modified in some function 
} 

Was ich brauche, ist die Variable var online Wert über verschiedene Module teilen (user.js und chat.js)

+0

Shop die Variable in einem Modul und ein Verfahren exportieren, der den Wert abruft. Sie können dann den Wert der gleichen Variablen von jedem Modul erhalten. – jfriend00

+0

Eine weitere Abfrage, wirkt sich dies auf die Leistung aus, wenn die Anzahl der Online-Benutzer zunimmt. Außerdem muss ich auch Variablen für Räume verwenden – Ajith

+0

Nein, dies hat keinen Einfluss auf die Leistung, da Online-Nutzer in keiner Weise zunehmen. In Ihrem Serverzeitraum ist eine Modulinstanz geladen. Sie erstellen nur eine Accessor-Funktion, um einige im Modul gespeicherte Daten abzurufen. Dies ist eine gängige und gute Möglichkeit, Daten ohne Skalierbarkeits-Nachteile auszutauschen. – jfriend00

Antwort

1

Was ich tun würde, ist der Wandel chat.js und user.js Funktionen .set andere Paramter zu akzeptieren online genannt. Dann können Sie aus app.js einen OnlineUsers-Wert an jede modifizierende .set-Funktion übergeben.

Dies funktioniert, weil JavaScript Wert überschreitet.

'use strict'; 
let obj = {}; 
(function firstModifier(obj) { 
    obj.first = true; 
})(obj); 
console.log(obj); 

Dies wird nur in einem Umfang arbeiten. Ich würde sehr gerne eine Datenbank für diese Art von Arbeit verwenden. Zum Verwalten von Online-Benutzern mit Knoten & socket.io habe ich mongodb gefunden und redis, um beide wirklich gute Entscheidungen zu sein. Der lohnende Vorteil davon ist, dass Ihre onlineUsers-Sammlung datenbankbasiert ist, anstatt eine onlineUsers-Variable im Anwendungsspeicher zu verwenden. Dann kann Ihre Anwendung einfach auf die Datenbank zugreifen, anstatt eine Variable "zu teilen".

+0

Danke für deine Antwort. Eine Frage, was Sie über die Verwendung der globalen Variablen in der separaten Datei "onlineUsers.js" denken, wie Sie oben anstelle der Datenbank erwähnt haben. Wenn wir eine Datenbank verwenden, kann dies zu einer Verzögerung bei der Ausführung bei verschiedenen Aktualisierungen und beim Abrufen von Problemen mit Nebenläufigkeit führen. Also plane ich, Variable zu verwenden, aber ich bin besorgt darüber, warum Sie gesagt haben, dass "Variable zu einem gewissen Grad funktioniert" – Ajith

+0

Es wird in einem Ausmaß funktionieren, dass Sie auf Anwendungsspeicher beschränkt sind. Dies könnte sehr gut für Ihre Verwendung sein. Wenn Sie viele Online-Benutzer haben und beträchtliche Datenmengen für jeden dieser Benutzer speichern (d. H. Ein Array von großen Objekten), führt eine Instanz eines Knotenprozesses die Aufgabe möglicherweise nicht aus. Siehe http://stackoverflow.com/questions/7193959/memory-limit-in-node-js-and-chrome-v8. Ich denke, mit onlineUsers.js wie oben oder mit @ jfriend00 Ansatz ist völlig in Ordnung, wenn Sie nicht erwarten, dass so viele Benutzer verwalten. – Yod

+0

Ich werde hinzufügen, dass durch Online-Benutzer Daten in einer Variablen innerhalb eines Node-Prozess gespeichert werden Sie alle diese Daten verlieren, wenn dieser Prozess stirbt. Also, wenn dies für eine Lernerfahrung oder ein kleines Projekt ist, ist es total cool - aber Sie könnten so etwas nicht mit einer Benutzerbasis machen und erwarten gute Ergebnisse. – Yod

Verwandte Themen