Zaktualizowana odpowiedź:15.05.2015
Jeśli chcesz dołączyć połączenie DB do każdego obiektu żądania, użyj tego połączenia w swojej usłudze, połączenie będzie musiało zostać przekazane do myService
jakoś. Poniższy przykład pokazuje jeden ze sposobów na zrobienie tego. Jeśli spróbujemy użyć db.current
lub coś w tym stylu, będziemy przechowywać stan w naszym module DB. Z mojego doświadczenia wynika, że doprowadzi to do kłopotów.
Alternatywnie przedstawiam podejście, którego użyłem (i nadal używam) w ta poprzednia odpowiedź . Oznacza to dla tego przykładu, co następuje:
// 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.
}
}
Dzięki takiemu podejściu oddzieliliśmy moduł DB od modułów api/app/router i tylko moduł, który faktycznie z niego korzysta, będzie wiedział, że istnieje.
Poprzednia odpowiedź:15.01.2015
To, o czym mówisz, można zrobić za pomocą ekspresowego oprogramowania pośredniczącego. Oto jak to może wyglądać:
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);
});
Osobiście nigdy nie widziałem czegoś takiego jak new MyService
wcześniej w aplikacjach ekspresowych. To nie znaczy, że nie da się tego zrobić, ale możesz rozważyć takie podejście
// 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!
}