Câu trả lời được cập nhật:05/02/15
Nếu bạn muốn đính kèm kết nối DB vào từng đối tượng yêu cầu, sau đó sử dụng kết nối đó trong dịch vụ của bạn, kết nối sẽ phải được chuyển tới myService
bằng cách nào đó. Ví dụ dưới đây cho thấy một cách để làm điều đó. Nếu chúng tôi cố gắng sử dụng db.current
hoặc điều gì đó có hiệu lực, chúng tôi sẽ lưu trữ trạng thái trong mô-đun DB của chúng tôi. Theo kinh nghiệm của tôi, điều đó sẽ dẫn đến rắc rối.
Ngoài ra, tôi đưa ra cách tiếp cận mà tôi đã sử dụng (và vẫn đang sử dụng) trong câu trả lời trước này . Điều này có nghĩa là gì đối với ví dụ này như sau:
// 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.
}
}
Với cách tiếp cận này, chúng tôi đã tách mô-đun DB khỏi các mô-đun api / app / router và chỉ mô-đun thực sự sử dụng nó mới biết nó tồn tại.
Câu trả lời trước:05/01/15
Những gì bạn đang nói có thể được thực hiện bằng cách sử dụng phần mềm trung gian nhanh. Đây là những gì nó có thể trông như thế nào:
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);
});
Cá nhân tôi chưa bao giờ thấy thứ gì đó giống như new MyService
trước trong các ứng dụng nhanh. Điều đó không có nghĩa là không thể thực hiện được, nhưng bạn có thể xem xét một cách tiếp cận như thế này
// 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!
}