MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Iniezione di dipendenze NodeJS Express e connessioni al database

Risposta aggiornata:02/05/15

Se desideri allegare una connessione DB a ogni oggetto della richiesta, quindi utilizza quella connessione nel tuo servizio, la connessione dovrà essere passata a myService in qualche modo. L'esempio seguente mostra un modo per farlo. Se proviamo a utilizzare db.current o qualcosa del genere, memorizzeremo lo stato nel nostro modulo DB. Nella mia esperienza, questo porterà a problemi.

In alternativa, espongo l'approccio che ho usato (e uso ancora) in questa risposta precedente . Ciò che significa per questo esempio è il seguente:

// 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 questo approccio, abbiamo disaccoppiato il modulo DB dai moduli api/app/router e solo il modulo che lo utilizza effettivamente saprà che esiste.

Risposta precedente:01/05/15

Quello di cui stai parlando potrebbe essere fatto usando un middleware rapido. Ecco come potrebbe essere:

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 non ho mai visto qualcosa come new MyService prima in applicazioni espresse. Ciò non significa che non possa essere fatto, ma potresti prendere in considerazione un approccio come questo

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