Pregunta ¿Cuál es la mejor práctica para las conexiones de MongoDB en Node.js?


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 voy a llegar a eso en el final de la publicación).

Entonces, suponiendo que estoy escribiendo una API con Node.js y Restify, donde cada punto final API corresponde a una función, debería:

un) abrir la conexión db y almacenarla en una var global, y luego simplemente 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

segundo) abrir la conexión db y luego 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
    });
}

do) abrir y cerrar el 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 por 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.


32
2017-08-03 16:47


origen


Respuestas:


me gusta MongoJS mucho. Le permite usar Mongo de una manera muy similar a la línea de comando predeterminada y es solo un envoltorio sobre el controlador oficial de Mongo. Solo abre el DB una vez y especifica qué colecciones usará. Incluso puede omitir las colecciones si ejecuta Node con --harmony-proxies.

var db = require('mongojs').connect('mydb', ['posts']);

server.get('/posts', function (req, res) {
  db.posts.find(function (err, posts) {
    res.send(JSON.stringify(posts));
  });
});

11
2017-08-03 18:40



  • La opción A no es una gran idea, ya que no hay garantía de que la base de datos se haya abierto antes de que se maneje una solicitud HTTP (con la condición de que esto sea muy poco probable)
  • La opción C tampoco es ideal, ya que innecesariamente abre y cierra la conexión DB

La forma en que me gusta manejar esto es usar diferimientos / promesas. Hay muchas bibliotecas de promesas diferentes disponibles para Node, pero la idea básica es hacer algo como esto:

var promise = new Promise();

db.open(function(err, db) {
    // handle err
    promise.resolve(db);
});

server.get('/api/something', function doSomething(req, res, next) {
    promise.then(function(db)
        // do something
    });
});

Creo que Mongoose maneja las conexiones de una manera que se asemeja vagamente a esto.


6
2017-08-03 17:54