MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Injection de dépendance NodeJS Express et connexions à la base de données

Réponse mise à jour :05/02/15

Si vous souhaitez attacher une connexion DB à chaque objet de requête, puis utiliser cette connexion dans votre service, la connexion devra être transmise à myService en quelque sorte. L'exemple ci-dessous montre une façon de procéder. Si nous essayons d'utiliser db.current ou quelque chose à cet effet, nous allons stocker l'état dans notre module DB. D'après mon expérience, cela entraînera des problèmes.

Alternativement, j'expose l'approche que j'ai utilisée (et que j'utilise toujours) dans cette réponse précédente . Ce que cela signifie pour cet exemple est le suivant :

// 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.
      }
}

Avec cette approche, nous avons dissocié le module DB des modules api/app/router et seul le module qui l'utilise réellement saura qu'il existe.

Réponse précédente :05/01/15

Ce dont vous parlez pourrait être fait en utilisant un middleware express. Voici à quoi cela pourrait ressembler :

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);
});

Personnellement, je n'ai jamais vu quelque chose comme new MyService avant dans les demandes expresses. Cela ne signifie pas que cela ne peut pas être fait, mais vous pourriez envisager une approche comme celle-ci

// 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!
}