sql >> Databasteknik >  >> NoSQL >> MongoDB

NodeJS Express Dependency Injection och Databas Connections

Uppdaterat svar:05/02/15

Om du vill koppla en DB-anslutning till varje förfrågningsobjekt, använd den anslutningen i din tjänst, anslutningen måste skickas till myService på något sätt. Exemplet nedan visar ett sätt att göra det. Om vi ​​försöker använda db.current eller något i den meningen kommer vi att lagra tillstånd i vår DB-modul. Enligt min erfarenhet kommer det att leda till problem.

Alternativt lägger jag upp det tillvägagångssätt jag har använt (och fortfarande använder) i det här tidigare svaret . Vad detta betyder för det här exemplet är följande:

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

Med detta tillvägagångssätt har vi kopplat bort DB-modulen från api/app/router-modulerna och bara modulen som faktiskt använder den kommer att veta att den finns.

Föregående svar:05/01/15

Det du pratar om kan göras med hjälp av en expressmellanvara. Så här kan det se ut:

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

Jag personligen har aldrig sett något liknande new MyService tidigare i uttryckliga ansökningar. Det betyder inte att det inte kan göras, men du kan överväga ett tillvägagångssätt som detta

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



  1. Ställ in MongoDb-omvandlaren programmatiskt

  2. GroupBy Aggregation inklusive saknade datum i mongo

  3. Applikationsfel efter installation av Meteor 1.0-appen på heroku

  4. Nodejs mongodb vaknar inte på servern