Aktualizovaná odpověď:2. 5. 2015
Pokud chcete ke každému objektu požadavku připojit DB připojení, pak toto připojení použijte ve své službě, připojení bude muset být předáno myService
Nějak. Níže uvedený příklad ukazuje jeden způsob, jak toho dosáhnout. Pokud se pokusíme použít db.current
nebo něco v tomto smyslu, budeme ukládat stav do našeho DB modulu. Podle mých zkušeností to povede k potížím.
Případně uvádím přístup, který jsem používal (a stále používám) v tato předchozí odpověď . Pro tento příklad to znamená následující:
// 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.
}
}
Díky tomuto přístupu jsme oddělili modul DB od modulů api/app/router a pouze modul, který jej skutečně používá, bude vědět, že existuje.
Předchozí odpověď:05/01/15
To, o čem mluvíte, by se dalo udělat pomocí expresního middlewaru. Zde je návod, jak to může vypadat:
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);
});
Osobně jsem nikdy neviděl něco jako new MyService
dříve v expresních aplikacích. To neznamená, že to nelze udělat, ale můžete zvážit takový přístup
// 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!
}