2013-06-13 20 views
17

Ich bin neu bei Node.js und MongoDB, aber ich habe es geschafft, einige Teile aus SO und die Dokumentation für Mongo zusammen zu stellen.Node.js und MongoDB, das DB-Objekt wiederverwendend

Mongo documentetion gibt das Beispiel:

// Retrieve 
var MongoClient = require('mongodb').MongoClient; 

// Connect to the db 
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) { 
    if(!err) { 
    console.log("We are connected"); 
    } 
}); 

Welche sieht gut aus, wenn ich nur die DB in einer Funktion an einem Ort verwenden müssen. Das Suchen und Lesen von SO hat mir gezeigt, dass ich nicht jedes Mal eine neue Verbindung öffnen sollte, sondern einen Pool verwenden und das Datenbankobjekt, das ich zum ersten Mal erhalte, wiederverwenden kann. Diese Antwort gibt es reichlich in SO, aber ich bin mir nicht sicher, wie man überhaupt das DB-Objekt an sich bringt und wie man es wiederverwenden kann.

sagen, dass ich die Node.js Code oben in meinem App.js haben, und ich habe dann Differnt Routen, die verschiedene Operationen auf dem db wie laufen müssen:

app.post('/employee', function(req, res){ 
    //Put req.name in database 
}); 


app.post('/car', function(req, res){ 
    //Put req.car in database 
}); 

Wie würde ich über gehen zu setzen diese zwei Schnipsel zusammen in etwas Nützliches?

Ich fand eine ähnliche Frage in Node.js reuse MongoDB reference, aber von der Optik dieses (http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html) sieht es aus wie ich MongoClient anstelle von db() verwenden sollte. Und ich bin mir nicht sicher, ob es auch mein Problem löst ...

Antwort

36

Sie könnten immer ein Modul schreiben, das Ihre Datenbankverbindungen initialisiert und im gesamten Programm zugänglich macht. Zum Beispiel:

mongo.js

var mongodb = require('mongodb'); 

module.exports.init = function (callback) { 
    var server = new mongodb.Server("127.0.0.1", 27017, {}); 
    new mongodb.Db('test', server, {w: 1}).open(function (error, client) { 
    //export the client and maybe some collections as a shortcut 
    module.exports.client = client; 
    module.exports.myCollection = new mongodb.Collection(client, 'myCollection'); 
    callback(error); 
    }); 
}; 

app.js

var mongo = require('./mongo.js'); 

//setup express... 

//initialize the db connection 
mongo.init(function (error) { 
    if (error) 
     throw error; 

    app.listen(80); //database is initialized, ready to listen for connections 
}); 

randomFile.js

var mongo = require('./mongo.js'); 

module.exports.doInsert = function() { 
    //use the collection object exported by mongo.js 
    mongo.myCollection.insert({test: 'obj'}, {safe:true}, function(err, objects) { 
    if (err) 
     console.warn(err.message); 
    }); 
}; 

Ich kenne Leute über Pooling reden, aber wenn ich es tat Benchmarking Das Sammeln von Mongo-Verbindungen gegenüber einer einzigen Verbindung für alle Anfragen, die einzelne Verbindung hat tatsächlich besser abgeschnitten. Zugegeben, das war vor ungefähr einem Jahr, aber ich bezweifle, dass sich das Grundkonzept geändert hat. Alle Anfragen sind asynchron, daher ist es nicht so, dass mehrere Verbindungen notwendig sind, um gleichzeitige Anfragen zu stellen.

Soweit MongoClient, ich denke, das ist die neue Syntax, die sie ermutigen. So oder so, es ist im Wesentlichen ein Client Objekt, das Sie behalten und zugänglich machen möchten, unabhängig davon, welchen Stil Sie verwenden.

+0

Hmm, muss auf Modulen und Sachen vor dem Versuch lesen. "module.exports.init" sieht seltsam für mich aus :) Aber was Sie sagen, ist, dass der Code in "app.js" nur einmal ausgeführt werden sollte, und dann ist der Code in "randomFile.js" der, den ich benutze in meiner App.post ('/ Mitarbeiter')? Da ich das erste Mal bin, habe ich alles in einer App.js-Datei. – user2288749

+0

Das ist richtig, die 'init' Funktion sollte nur einmal aufgerufen werden. Die 'randomFile.js' war nur ein Beispiel, um zu zeigen, dass Sie die initialisierte Datenbank von überall im Code verwenden können. Ich könnte genauso einfach in app.js verwendet werden.Sie sollten auf jeden Fall verstehen, wie Module funktionieren, wenn Sie mit Knoten arbeiten, aber sie sind wirklich nicht schwierig. –

+0

Vielen Dank für Ihre Zeit und Mühe, ich habe es heute funktioniert! Wenn ich den Server starte, bekomme ich sofort 5 Verbindungen zur DB. Ist das schlimm? (Raten 5, da es die standardmäßig erlaubten Verbindungen sind?) Ich habe den Init-Anruf geändert und wie ich das Modul verwende, siehe http://pastebin.com/QFdZY51F – user2288749

3

Von Ihrem letzten Code-Snippet, scheint wie Sie Express oder ähnliches Framework verwenden. Sie können express-mongo-db verwenden, um eine Verbindung innerhalb von req Objekt zu erhalten. Diese Middleware wird die Verbindung für Sie zwischenspeichern und mit anderen eingehenden Anfragen teilen: