sql >> Base de Datos >  >> NoSQL >> MongoDB

Inyección de dependencia de NodeJS Express y conexiones de base de datos

Respuesta actualizada:02/05/15

Si desea adjuntar una conexión de base de datos a cada objeto de solicitud, luego use esa conexión en su servicio, la conexión deberá pasarse a myService de alguna manera. El siguiente ejemplo muestra una forma de hacerlo. Si intentamos usar db.current o algo por el estilo, almacenaremos el estado en nuestro módulo DB. En mi experiencia, eso conducirá a problemas.

Alternativamente, expongo el enfoque que he usado (y sigo usando) en esta respuesta anterior . Lo que esto significa para este ejemplo es lo siguiente:

// api.js
var MyService = require(./services/MyService')

...

router.get('/foo/:id?', function (req, res) {
    MyService.performTask(req.params.id);
});


// MyService.js
var db = require('db');
module.exports = {
   performTask: function(id)
      {
         var connection = db.getOpenConnection();
         // Do whatever you want with the connection.
      }
}

Con este enfoque, hemos desacoplado el módulo DB de los módulos api/app/router y solo el módulo que realmente lo usa sabrá que existe.

Respuesta anterior:01/05/15

Lo que estás hablando podría hacerse usando un middleware express. Así es como podría verse:

var db = require('db');

// Attach a DB connection to each request coming in
router.use(req, res, next){
   req.locals.db = db.getOpenConnection();
   next();
}

// Later on..
router.get('/foo/:id?', function (req, res) {
  // We should now have something attached to res.locals.db!
  var service = new MyService(res.locals.db);
});

Personalmente nunca he visto algo como new MyService antes en aplicaciones express. Eso no significa que no se pueda hacer, pero podría considerar un enfoque como este

// router.js
var MyService = require('MyService');
router.get('/foo/:id?', function (req, res) {
  MyService.foo(res.locals.db);
});

// MyService.js
module.exports.foo(connection){
  // I have a connection!
}