2016-11-30 2 views
1

ich gerade lernen, wie man Knoten/Express- und mongodb verwenden, und ich bin ein wenig verwirrt über Verbindungen Werke bündeln.Mit mongoDB in Express Router

jetzt Meine Strategie ist es, die Datenbankverbindungen auf Router-Ebene zu haben, so dass jede Strecke eine eigene Verbindung hat. Mein Code für einen meiner Routen sieht wie folgt aus:

var express = require('express'); 
var router = express.Router(); 

var config = require('../config.json'); 

var url = config.db.URI; 

var MongoClient = require('mongodb').MongoClient 
    , assert = require('assert'); 

var db; 

// Connect to database 
router.all('*', function(req, res, next) { 
    console.log('Connecting to db'); 
    MongoClient.connect(url, function(err, database) { 
     assert.equal(null, err); 
     db = database; 
    }); 
    next(); 
}); 

// GET admin list page 
router.get('/', function(req, res, next) { 
    res.render('lists/index'); 
    var coll = db.collection('lists'); 
    coll.find().each(function(err, obj) { 
     console.log(obj); 
    }); 
    next(); 
}); 

router.get('/new', function(req, res, next) { 
    res.render('lists/new'); 
    next(); 
}); 

router.all('*', function(req, res, next) { 
    console.log('Closing database'); 
    //db.close(); 
}); 

module.exports = router; 

Ich prüfe, wie diese Ansicht mit der Datenbank-Anfragen mit den beiden router.all Funktionen schlang meine http interagiert. Meiner Meinung nach sollte der Server, wenn eine Seite in diesem Router angefordert wird, eine Verbindung mit der Datenbank herstellen, die entsprechende HTTP-Anforderungsfunktion für den Zugriff auf die Datenbank zulassen (in diesem Fall nur den Inhalt der Konsole drucken) und dann am Ende schließen Sobald die HTTP-Anfrage abgeschlossen ist. Dies ist jedoch nicht der Fall. Wie Sie sehen können, habe ich die Funktion db.close auskommentiert, da sie den Fehler "Kann Header nicht einmal einstellen, wenn sie gesendet wurden" damit auslöst. Ich nehme an, dies bedeutet, dass ich die Express-Route "Pipeline" nicht ganz verstehe und die Dinge nicht in der Reihenfolge ausgeführt werden, in der ich sie auch erwarte.

Gibt es eine andere Router Methode, die ich verwenden soll? Vielleicht router.use? Oder nähere ich mich dem falsch, sollte ich meine Datenbankverbindung irgendwo anders platzieren?

Ich verwende this als eine Referenz etwas, was gute Praxis ist, soweit Pooling geht, aber sie scheinen nicht die Verbindung zu schließen? Wenn ich die Verbindung nicht schließe, sehe ich nur, dass meine Anzahl an Mongodb-Verbindungen steigt und steigt, was ich nicht für eine gute Sache halte. Müssen Sie nur eine Balance zwischen Anzahl und Länge der Verbindungen finden?

Antwort

2

Sie sollten Ihre Verbindung einmal machen und es in allen Behandlungsroutinen verwenden.

Gerade jetzt, was Sie auf jeder einzelnen Anfrage an die Datenbank, eine erneute Verbindung tun, auch auf jene Anforderungen, die überhaupt nicht auf die Datenbank verwenden. Außerdem rufst du next() an, bevor du überhaupt darauf wartest, dass die Verbindung hergestellt wird.

Datenbankverbindungen sind persistent - keine einmaligen Dinge, also werden Sie wahrscheinlich sehr schlechte Leistung mit Ihrem Ansatz bekommen und ich bin mir nicht einmal sicher, warum Sie das tun wollen. Hatten Sie Probleme mit einer einzelnen Verbindung? Ich denke nicht, dass das Hämmern Ihrer Datenbank helfen würde. Wenn überhaupt, kann es die Dinge nur verschlimmern.

Wenn Sie mit der nativen MongoDB Node.js Driver dort Mongo verbinden, sind einige Optionen, die Sie verwenden können, wie:

  • poolSize - Legen Sie die maximale Poolsize für jeden einzelnen Server oder Proxy-Verbindung (Standard ist 5)
  • autoReconnect - Schließen Sie bei einem Fehler (Standardeinstellung ist true)

Einige andere interessante Optionen sind: reconnectTries, reconnectInterval, keepAlive, connectTimeoutMS, socketTimeoutMS.

Sie können die Werte dieser Optionen ändern, wenn Sie mit den Standardeinstellungen nicht zufrieden sind.

Für weitere Informationen siehe:

+0

Also, wenn ich eine Verbindung herstellen soll die Datenbank einmal beim Start des Website-Servers, dann verwenden Sie diese Verbindung für alle Abfragen nach Bedarf? Wird das nur eine Verbindung zur Datenbank sein? Oder startet jeder Benutzer, der auf die Site zugreift, eine neue Verbindung? Ich stimme zu, dass ich die Datenbank nicht mit Verbindungsanforderungen hämmern möchte, aber ich hielt es nicht für eine gute Idee, eine Verbindung für die gesamte Laufzeit des Programms offen zu lassen, also versuchte ich, eine Balance zu finden . Dies ist das erste Mal, dass ich eine Datenbank wie Mongo verwende, also bin ich mir nicht sicher, was die besten Praktiken sind. –

+0

Wäre ein Ansatz wie [this] (https://www.terlici.com/2015/04/03/mongodb-node-express.html) geeigneter? –

+0

@GeoffMcLennan Ja, es ist in Ordnung, die Verbindung einmal zu öffnen und sie einfach zu benutzen. Sie können die Optionen ändern, die das Wiederverbinden, Pooling usw. konfigurieren, wenn Sie mit den Standardeinstellungen nicht zufrieden sind. Siehe die Links, die ich der Antwort hinzugefügt habe. – rsp