2012-12-17 88 views
0

背景Node.js:模塊繼承的正確方法是什麼?

我正在一個簡單的web服務器上使用express.js頂部node.js。當我爲我的服務器製作路由處理程序時,我不可避免地要分解出一些常見的功能。所以我想創建一個baseHandler,它具有所有常見處理函數(如數據庫連接),並且在編寫其他路由處理函數時,我想「擴展」baseHandler以方便地獲取這些常用處理函數。

我試圖

什麼是實現它的方式,什麼是這樣做的正確方法?我正在嘗試一個非常直接的解決方案,我將baseHandler作爲普通處理程序模塊編寫,具有本地mysql實例並導出操縱數據庫的函數。代碼如下:

// Mysql 
var _mysql = require('mysql'); 

// Mysql connection 
exports.getDbHandle = function() { 
    var mysql = _mysql.createConnection({ 
    host: xxx 
    port: xxx 
    user: xxx 
    password: xxx 
    database: xxx 
}); 
return mysql; 
}; 

然後在我的路由處理程序,我只需要這個模塊,並使用它的任何功能。這似乎解決了這個問題,但我有一種感覺,這是不正確的做法。因爲我將在我的路由處理程序中擁有一個baseHandler模​​塊實例,並且它感覺像是一個實用程序模塊,而不是它自己的路由處理程序的一部分。

問題

那麼什麼是在延長的NodeJS模塊的正確方法?

回答

3

將通用功能放入中間件中,您可以將其插入需要該功能的路由中,而不是創建類層次結構。這迫使您將功能徹底解耦合爲獨立的組件。中間件可以通過將這些數據庫連接作爲req請求對象的屬性添加到路由中,從而使數據庫連接可用。

+0

謝謝你的回答,但在閱讀之後我還有更多的問題......我是Node.js的新手,所以我恐怕不能完全理解你的答案。您能否進一步解釋我如何將中間件插入到路由中?我怎樣才能將屬性添加到請求對象?整個流程是什麼? –

+1

@Xavier_Ex查看關於路由中間件主題的[此博客文章](https://blog.caurea.org/2011/11/05/express-route-middleware-chains.html)。它使用CoffeeScript示例代碼,但即使您不熟悉該代碼,您也應該能夠獲得它的要點。 – JohnnyHK

+0

謝謝,我會先讀一下它。 –

相關問題