Usando mongoDB en enrutadores Express

Solo estoy aprendiendo a usar node / express y mongodb, y estoy un poco confundido acerca de la combinación de conexiones.

Mi estrategia ahora es tener las conexiones de la base de datos en el nivel del enrutador, de modo que cada ruta tenga su propia conexión. Mi código para una de mis rutas se ve así:

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; 

Estoy probando cómo esta vista interactúa con mi base de datos con las dos funciones de router.all que envuelven mis solicitudes http. En mi opinión, cada vez que se solicita una página en este enrutador, el servidor debe conectarse a la base de datos, permitir que la función de solicitud http correspondiente acceda a la base de datos (en este caso, simplemente imprimiendo su contenido en la consola), luego cerrarla al final una vez que se realiza la solicitud http. Sin embargo, éste no es el caso. Como puede ver, he comentado la función db.close ya que emite un error que dice “No se pueden establecer los encabezados una vez que se envían” con él. Supongo que esto significa que no entiendo muy bien el “canal” de la ruta Express y que las cosas no se ejecutan en el orden en que las espero también.

¿Hay algún método de enrutador diferente que deba usar? Tal vez router.use? ¿O me estoy acercando a esto de manera incorrecta, debo poner mi conexión de base de datos en otro lugar?

Estoy usando esto como referencia de alguna manera sobre lo que es una buena práctica en lo que respecta a la agrupación, pero ¿parece que no cierran la conexión? Si no cierro la conexión, simplemente veo que mi número de conexiones mongodb sube y sube, lo que no creo que sea bueno. ¿Es solo que tiene que encontrar un equilibrio entre el número y la longitud de las conexiones?

Debes hacer tu conexión una vez y usarla en todos los manejadores.

En este momento, lo que está haciendo es volver a conectarse a la base de datos en cada solicitud, incluso en aquellas solicitudes que no utilizan la base de datos en absoluto. Además, estás llamando a next () antes de esperar a que se establezca la conexión.

Las conexiones de la base de datos están destinadas a ser persistentes, no solo una vez, por lo que es probable que obtenga un rendimiento muy bajo con su enfoque y ni siquiera estoy seguro de por qué querría hacer eso. ¿Tuviste algún problema con una sola conexión? No creo que martillar tu base de datos de esa manera ayude. En todo caso, solo puede empeorar las cosas.

Cuando se conecta a Mongo con el controlador nativo de MongoDB Node.js, hay algunas opciones que puede usar, como:

  • poolSize : establece el poolSize máximo para cada servidor individual o conexión proxy (el valor predeterminado es 5 )
  • autoReconnect : autoReconnect conectar en caso de error (el valor predeterminado es true )

Algunas otras opciones interesantes son: keepAlive , connectTimeoutMS , socketTimeoutMS , connectTimeoutMS , socketTimeoutMS .

Puede cambiar los valores de esas opciones si no está satisfecho con los valores predeterminados.

Para más información ver:

  • Fallos de conexión y rebashs
  • MongoClient o cómo conectarse de una manera nueva y mejor.
  • Tutoriales / Conectar a MongoDB
  • Referencia / Opciones de conexión / Configuración de conexión
  • Pregunta sobre la auto-reconexión del controlador node.js mongo (lista de correo)