MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

NodeJS Express Dependency Injection und Datenbankverbindungen

Aktualisierte Antwort:02.05.15

Wenn Sie jedem Anforderungsobjekt eine DB-Verbindung hinzufügen möchten, verwenden Sie diese Verbindung in Ihrem Dienst. Die Verbindung muss an myService übergeben werden irgendwie. Das folgende Beispiel zeigt eine Möglichkeit, dies zu tun. Wenn wir versuchen, db.current zu verwenden oder so ähnlich, wir speichern den Zustand in unserem DB-Modul. Meiner Erfahrung nach führt das zu Problemen.

Alternativ lege ich den Ansatz, den ich verwendet habe (und immer noch verwende), in diese vorherige Antwort . Für dieses Beispiel bedeutet dies Folgendes:

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

Mit diesem Ansatz haben wir das DB-Modul von den API-/App-/Router-Modulen entkoppelt und nur das Modul, das es tatsächlich verwendet, weiß, dass es existiert.

Vorherige Antwort:01.05.15

Wovon Sie sprechen, könnte mit einer Express-Middleware durchgeführt werden. So könnte es aussehen:

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

Ich persönlich habe so etwas wie new MyService noch nie gesehen zuvor in Expressanwendungen. Das bedeutet nicht, dass es nicht möglich ist, aber Sie könnten einen Ansatz wie diesen in Betracht ziehen

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