2012-10-26 24 views
6

Ich bin auf der Suche nach einer Richtung hier von einigen erfahrenen node.js Programmierer. Das größte Problem, auf das ich stoße, ist die Weitergabe von Variablen in separate Module. Zum Beispiel in meinem server.js habe ich folgendes:node.js übergeben Variablen

var db = mongoose.createConnection('localhost','test'); 

Jetzt bin ich nicht laufen meine Routen innerhalb der server.js Datei, die sie in dort eigene Dateien getrennt sind. So für ein Blog Beispiel könnte es so aussehen:

app.get('/blog/post/:id',function(req,res){ 
    //do something here 
} 

Nun ist dies, wo das Problem kommt Ich will nicht zur Einrichtung einer Datenbankverbindung in jedem meiner Routen haben und nicht zu erwähnen, würde ich denken. dass es eine Menge Verbindungen machen würde. Wie gehe ich damit um? Gibt es eine "REAL WORLD" -Applikation da draußen? Ich kann anscheinend nichts darüber finden und ich weiß, dass Leute dieses Problem vorher haben mussten. Ich weiß, dass Knoten die Module zwischenspeichert, aber ich kann mir nicht vorstellen, dass es die Verbindung zwischenspeichern würde, da es in einem eigenen Modul war. Ich habe ein Config-Modul erstellt, das nur die Site-Konfiguration enthält, so dass dies erforderlich ist, wo ich es brauche, ist kein Problem. Ich stelle mir vor, dass es noch andere Dinge gibt, mit denen ich das machen möchte, also wäre es das Beste, das jetzt herauszufinden.

Jede Hilfe wird geschätzt.

Antwort

3

Hier ist, was ich in meiner realen Welt App mache.

Ich habe ein Modul mit dem Namen redis (das ist die Datenbank, die ich verwende). Es enthält den folgenden Code:

var store; 

exports.store = store = redis.createClient(config.port, config.url); 

So kann ich direkt auf den Client zugreifen, wenn ich muss. Das mache ich fast nie. Das gleiche Modul enthält Code wie folgt:

exports.getData = function(dataID, callback){ 

    var key = DATA_STORE_PREFIX; 

    try{ 
     store.hget(key, dataID, callback); 
    } catch(err){ 
     callback(err); 
    } 
} 

I dieses verwenden, indem die redis Modul in einem oder mehreren Streckenmodule und es so Aufruf:

var db = require('redis'); 

db.getData('someData', function(err, result){ 
    console.log(result); // real world code goes here! 
}); 

Der Knoten-Modulsystem übernimmt die sich ausruhen.

+0

Also meine einzige Frage zu diesem ist dies schafft eine neue Verbindung jedes Mal? Ich habe das schon angefangen, aber ich möchte sicher sein, dass es nicht so ist. – ngreenwood6

+0

Es scheint eine bestehende Verbindung wiederzuverwenden, wenn sie eine hat. Wenn Verbindungen automatisch unterbrochen werden, wenn sie nicht verwendet werden, wird die Verbindung wiederhergestellt. –

2

Eine Möglichkeit besteht darin, die Verbindung als Eigenschaft eines Objekts hinzuzufügen, das allen Modulen zur Verfügung steht, die sie benötigen. Zum Beispiel in meiner ausdrücklichen app habe ich so etwas in meiner Haupt-App-Datei:

require('./config/database')(app); 

und die config/database Datei wie folgt aussieht:

var mongoose = require('mongoose'); 

module.exports = function(app) { 
    var database = app.get('env'); 
    var uri = database === 'production' ? 'something...' : 'localhost'; 
    return app.locals.db = mongoose.createConnection(uri, database); 
}; 

Irgendwelche Module, die eine DB-Verbindung müssen dann app.locals.db zugreifen kann einfach durch Exportieren einer Funktion, die app als Argument verwendet (genau wie oben). Natürlich müssen Sie das etwas ändern, wenn Sie etwas anderes als Express verwenden, aber die Idee bleibt gleich.

+0

Sehr kreative Lösung, aber ich denke, dass diese Art von Wolken die Einheimischen.Dies ist definitiv etwas Nützliches, um Daten automatisch an Locals zu übergeben. – ngreenwood6

+0

Ich denke, dafür ist 'app.locals' da. Ich habe dies in meinem aktuellen Projekt durch rekursives automatisches Laden und Zuordnen aller Hauptkomponenten der Anwendung zu Eigenschaften von "app.locals" - z. Alle meine Modelle sind in 'app.locals.models'. Ich mag dieses Muster aus zwei Gründen: Erstens arbeiten meine Module unabhängig von der Dateistruktur, d. H. Ich muss nicht überall Dinge wie 'require ('../../ models/user') schreiben. Zweitens sind meine gemeinsamen Bibliotheken für die Ansichten verfügbar - z. wenn ich eine 'app.locals.lib.urlFor' habe, kann ich sie in einer Ansicht als' lib.urlFor' verwenden. –

+0

Ja, wie ich sagte, ich denke, es hat seine Verwendung (vor allem für die Konfiguration oder Dienstprogramme), aber die db ich mag es nur zu erfordern. Danke, obwohl für die Eingabe du hast einen echten gültigen Punkt über die Anforderungen – ngreenwood6

1

Sie verwenden Express, ich verstehe. Just do:

app.set('db', mongoose.createConnection('localhost','test')) 

dann in jedem Modul Konstruktor, stellen Sie sicher, die app Variable übergeben, und Sie app.get('db') bekommen können db zu arbeiten.

+0

Danke für die Antwort, aber ich denke, dass die andere Lösung viel besser passt. Dann können meine Module generischer sein und es scheint einfach sauberer zu sein. – ngreenwood6

Verwandte Themen