2016-06-10 8 views
3

Ich versuche, eine einzelne Verbindung zu meinem MongoDB herzustellen und die Antwort (Datenbank) zu speichern, die ich in einer globalen Variable zurückbekomme, damit ich sie in separater JS-Datei wiederverwenden kann (wie die separaten Dateien für meine Routen). Ich folge dieser Dokumentation als Beispiel: https://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html#mongoclient-connection-pooling.Node.js + MongoDB globale Variable und Gültigkeitsbereich

Erster Versuch: var mongodb = require ('mongodb'), MongoClient = mongodb.MongoClient, MongoURL = "my_mongodb_url: port/database_name", global.db;

Nach einigen Recherchen fand ich eine mögliche Lösung für das Problem: Erstellen Sie eine globale Variable in Knoten mit einem globalen Präfix. Aber es ist immer noch nicht funktioniert ...

Zweiter Versuch:

var mongodb = require('mongodb'), 
    MongoClient = mongodb.MongoClient, 
    MongoURL = "my_mongodb_url:port/database_name", 
    global.db; 

MongoClient.connect(MongoURL, function(err, database) { 
    global.db = databse; 
    console.log(db); // shows stuff 
} 

console.log(global.db); // shows undefined 

Der Code vor allem in der gleichen Datei gesetzt wird [app.js]. Ich denke, es hat mit dem Umfang von MongoClient zu tun. Aber ich bin mir nicht sicher. Gibt es eine Möglichkeit, dies zum Funktionieren zu bringen?

Antwort

4

Das ist eigentlich nur ein Order-of-Execution-Problem. Der Anruf MongoClient.connect(...) ist asynchron. Die von Ihnen übergebene Rückruffunktion wird erst aufgerufen, wenn die Verbindung hergestellt wurde. Die console.log(global.db), die Sie am Ende haben, wird jedoch sofort aufgerufen, vor der Ihr Rückruf aufgerufen wird.

Sie müssen hier nicht explizit db global vornehmen. Variablen, die im äußeren Bereich eines Moduls definiert sind, befinden sich im globalen Gültigkeitsbereich des Moduls. Wenn ein Wert an global angehängt wird, ist er für mehrere Module verfügbar, aber eine bessere Möglichkeit, Werte zwischen Modulen verfügbar zu machen, besteht darin, sie an exports anzuhängen, damit sie bei Bedarf explizit importiert werden können. Wenn Sie nur db in diesem Modul verwenden, ist das nicht notwendig.

+0

Ich sehe, das macht sehr viel Sinn! Ich arbeite tatsächlich mit verschiedenen Modulen, zum Beispiel einem Routenmodul, wo ich die Variable db verwenden werde. Ich werde in "export" lesen. Danke vielmals. :-) –