17 Stimmen

Node.js und MongoDB, Verwendung des DB-Objekts

Ich bin neu sowohl in Node.js als auch in MongoDB, aber ich habe es geschafft, einige Teile aus SO und der Dokumentation für MongoDB zusammenzustellen.

Die MongoDB-Dokumentation gibt das Beispiel:

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

// Mit der Datenbank verbinden
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
  if(!err) {
    console.log("Wir sind verbunden");
  }
});

Das sieht gut aus, wenn ich die DB nur in einer Funktion an einem Ort verwenden muss. Die Recherche in SO hat gezeigt, dass ich nicht jedes Mal eine neue Verbindung öffnen sollte, sondern stattdessen einen Pool verwenden und das Datenbankobjekt wiederverwenden sollte, das ich das erste Mal bekomme. Diese Antwort ist auf SO reichlich vorhanden, aber ich bin mir nicht sicher, wie ich überhaupt das DB-Objekt bekomme und wie ich es wiederverwenden kann.

Angenommen, ich habe den oben stehenden Node.js-Code in meiner App.js und dann habe ich verschiedene Routen, die verschiedene Operationen in der Datenbank ausführen müssen, wie:

app.post('/employee', function(req, res){
    // req.name in die Datenbank eintragen
});

app.post('/car', function(req, res){
    // req.car in die Datenbank eintragen
});

Wie könnte ich diese beiden Snippets zu etwas Nützlichem zusammenführen?

Ich habe eine ähnliche Frage in Node.js MongoDB-Referenz wiederverwenden gefunden, aber anscheinend sollte ich laut diesem ( http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html ) MongoClient anstelle von db() verwenden. Und ich bin mir nicht sicher, ob es mein Problem löst...

37voto

Bret Copeland Punkte 22530

Sie könnten immer ein Modul schreiben, das Ihre Datenbankverbindungen initialisiert und sie in Ihrem 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) {
    //exportieren Sie den Client und vielleicht einige Sammlungen als Abkürzung
    module.exports.client = client;
    module.exports.myCollection = new mongodb.Collection(client, 'myCollection');
    callback(error);
  });
};

app.js

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

//Express einrichten...

//initialisieren Sie die DB-Verbindung
mongo.init(function (error) {
    if (error)
        throw error;

    app.listen(80); //Datenbank initialisiert, bereit zum Empfangen von Verbindungen
});

randomFile.js

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

module.exports.doInsert = function () {
  //verwenden Sie das von mongo.js exportierte Collection-Objekt
  mongo.myCollection.insert({test: 'obj'}, {safe:true}, function(err, objects) {
    if (err)
        console.warn(err.message);
  });
};

Ich weiß, dass Leute über Pooling sprechen, aber als ich ein Benchmarking von Pooling-Mongo-Verbindungen gegen eine einzelne Verbindung für alle Anfragen durchgeführt habe, hat die einzelne Verbindung tatsächlich besser funktioniert. Zugegeben, das war vor etwa einem Jahr, aber ich bezweifle, dass sich dieses grundlegende Konzept geändert hat. Alle Anfragen sind asynchron, also ist es nicht so, dass mehrere Verbindungen erforderlich sind, um gleichzeitige Anfragen zu stellen.

Was MongoClient betrifft, denke ich, dass dies die neue Syntax ist, die sie fördern. So oder so, es handelt sich im Grunde um ein Client-Objekt, das Sie behalten und unabhängig vom verwendeten Stil zugänglich machen möchten.

3voto

floatdrop Punkte 615

Aus Ihrem letzten Code-Schnipsel sieht es so aus, als ob Sie Express oder ein ähnliches Framework verwenden. Sie können express-mongo-db verwenden, um eine Verbindung im req-Objekt zu erhalten. Dieses Middleware wird die Verbindung für Sie zwischenspeichern und sie mit anderen eingehenden Anfragen teilen:

app.use(require('express-mongo-db')(require('mongodb'), { db: 'test' }))
app.post('/employee', function(req, res){
    // req.db.collection('names'),insert(req.name)
    // Setzen Sie req.name in die Datenbank
});

app.post('/car', function(req, res){
    // req.db.collection('names').insert(req.name)
    // Setzen Sie req.car in die Datenbank
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X