Bijgewerkt antwoord:05/02/15
Als u een DB-verbinding aan elk aanvraagobject wilt koppelen, gebruik die verbinding dan in uw service, de verbinding moet worden doorgegeven aan myService
een beetje hoe. Het onderstaande voorbeeld toont een manier om dat te doen. Als we db.current
. proberen te gebruiken of iets in die zin, we slaan de status op in onze DB-module. In mijn ervaring zal dat tot problemen leiden.
Als alternatief leg ik de aanpak uit die ik heb gebruikt (en nog steeds gebruik) in dit vorige antwoord . Dit betekent voor dit voorbeeld het volgende:
// 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.
}
}
Met deze aanpak hebben we de DB-module losgekoppeld van de api/app/router-modules en alleen de module die deze daadwerkelijk gebruikt, weet dat deze bestaat.
Vorige antwoord:05/01/15
Waar je het over hebt zou kunnen worden gedaan met behulp van een express middleware. Zo zou het eruit kunnen zien:
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);
});
Ik heb persoonlijk nog nooit zoiets gezien als new MyService
eerder in uitdrukkelijke toepassingen. Dat betekent niet dat het niet kan, maar je zou een aanpak als deze kunnen overwegen
// 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!
}