2015-05-01 73 views
1

從非節點背景的人,我的第一直覺是定義我的服務爲這樣的NodeJS快遞依賴注入和數據庫連接

MyService.js 

module.exports = new function(dbConnection) 
{ 
    // service uses the db 
} 

現在,我想每個請求一個開放式數據庫連接,所以我在中間件定義:

res.locals.db = openDbConnection(); 

而且在一些消費快速API代碼:

api.js 

var MyService = require(./services/MyService') 

... 

router.get('/foo/:id?', function (req, res) { 
    var service = new MyService(res.locals.db); 
}); 

現在,因爲Node的依賴注入的首選方法是通過require(...)聲明,所以我似乎不應該使用MyService的構造函數來注入db

所以我們可以說我希望有

var db = require('db'); 

MyService頂部,然後用某種方式像db.current ....但我怎麼會扎到當前res.locals對象的數據庫,現在db是模塊本身?在Node中處理這種瘦的建議方式是什麼?

回答

0

更新答:15年5月2日

如果您要附加一個數據庫連接到每個請求的對象,然後使用你的服務,它的連接,該連接將被傳遞到myService一些如何。下面的例子顯示了一種做法。如果我們嘗試使用db.current或其他類似的東西,我們將在我們的DB模塊中存儲狀態。根據我的經驗,這會導致麻煩。

或者,我在this previous answer中展示了我已經使用(並仍在使用)的方法。這意味着什麼,這個例子是:

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

通過這種方法,我們已經從API /應用/路由器模塊,只有實際使用它會知道它的存在的模塊分離數據庫模塊。

以前的答案:15年5月1日

什麼你談論的是可以使用的快遞中間件完成。下面是它可能看上去是這樣的:

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

我個人從來沒有見過類似的東西new MyService快遞應用程序之前。這並不意味着它不能完成,但你可能會考慮這樣的方法

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

正確,但現在我的構造函數或MyService中的方法需要db作爲參數。由於我們正在討論如何「接近」節點中的依賴關係/需求,所以我期望需要('db')....並且因爲您從未見過新的MyService ......您期望什麼呢? – Jeff

+0

嘿傑夫,我想我更瞭解你的問題。我相應地更新了我的答案。如果我離得更近,請告訴我! – Brennan