MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

NodeJS Express Dependency Injection e conexões de banco de dados


Resposta atualizada:05/02/15

Se você deseja anexar uma conexão de banco de dados a cada objeto de solicitação, use essa conexão em seu serviço, a conexão terá que ser passada para myService de alguma forma. O exemplo abaixo mostra uma maneira de fazer isso. Se tentarmos usar db.current ou algo nesse sentido, estaremos armazenando o estado em nosso módulo de banco de dados. Na minha experiência, isso levará a problemas.

Como alternativa, exponho a abordagem que usei (e ainda uso) em esta resposta anterior . O que isso significa para este exemplo é o seguinte:
// 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.
      }
}

Com essa abordagem, desacoplamos o módulo DB dos módulos api/app/router e somente o módulo que realmente o usa saberá que ele existe.

Resposta anterior:01/05/15

O que você está falando poderia ser feito usando um middleware expresso. Veja como pode ser:
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);
});

Eu pessoalmente nunca vi algo como new MyService antes em aplicações expressas. Isso não significa que não pode ser feito, mas você pode considerar uma abordagem como esta
// 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!
}