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?
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. –
Wäre ein Ansatz wie [this] (https://www.terlici.com/2015/04/03/mongodb-node-express.html) geeigneter? –
@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