Esto es algo que no está claro para mí (estoy empezando con Node y Mongo), y realmente me preocupa por el rendimiento y la tensión del servidor (que supongo que es otra pregunta, pero llegaré a eso al final de la publicación).¿Cuál es la mejor práctica para las conexiones de MongoDB en Node.js?
Así, suponiendo que estoy escribiendo una API con Node.js y Restify, donde cada punto final de la API corresponde a una función, debería:
a) abrir la conexión db y almacenarlo en un mundial var, y luego solo usar eso en cada función?
Ejemplo:
// requires and so on leave me with a db var, assume {auto_reconnect: true}
function openDB() {
db.open(function(err, db) {
// skip err handling and so on
return db;
}
}
var myOpenDB = openDB(); // use myOpenDB in every other function I have
b) abrir la conexión db y luego sólo hay que poner todo en un cierre gigante?
Ejemplo:
// same as above
db.open(function(err, db) {
// do everything else here, for example:
server.get('/api/dosomething', function doSomething(req, res, next) { // (server is an instance of a Restify server)
// use the db object here and so on
});
}
c) abrir y cerrar la db cada vez que se necesita?
Ejemplo:
// again, same as above
server.get('/api/something', function doSomething(req, res, next) {
db.open(function(err, db) {
// do something
db.close();
});
});
server.post('/api/somethingelse', function doSomethingElse(req, res, next) {
db.open(function(err, db) {
// do something else
db.close();
});
});
Esto último es lo que haría de la intuición, pero al mismo tiempo no me siento del todo cómodo haciendo esto. ¿No pone demasiada tensión en el servidor de Mongo? Especialmente cuando (y espero llegar a eso) recibe cientos, si no miles, de llamadas como esta.
Gracias de antemano.
Tenga en cuenta que para la opción B, puede evitar fácilmente el cierre masivo mediante el uso de funciones con nombre, evitando así el retrollamado. Dicho esto, si estás usando un nodo, estás usando módulos (¡espero!) Lo que significa que está bien tener (¡algunas pequeñas cantidades de variables declaradas!) - no contaminarán el espacio de nombres de nadie más, ya que nada deja el archivo '.js' excepto las exportaciones de su módulo. – Gijs
Gracias! Entonces, ¿sugieres que use la opción B? He estado investigando sobre el [grupo de Google] del conductor (https://groups.google.com/forum/?fromgroups#!forum/node-mongodb-native) y todos parecen sugerir alguna forma de reutilización de la conexión (la mayoría de ellos sugieren algo como la opción B). – ArturoVM
Por otro lado, leí en alguna parte que hacer todo bajo la misma conexión es bloqueo, derrotando el propósito de la naturaleza asincrónica de Node. – ArturoVM