2013-07-25 125 views
1

我正在構建Node Web應用程序(使用Express)並儘可能使所有內容儘可能幹,我會自動獲取每個請求的數據庫連接,但我也需要釋放它(回到池)。捕獲HTTP響應事件

我可以在每條路徑上手動執行該操作,但這隻會污染代碼。我想我應該聽服務器事件並在響應完成生成或發送後釋放它。我有什麼選擇?當響應完成什麼事件(和其對象(應用程序,請求或其他)內被觸發?

回答

4

res從EventEmitter繼承,並且可以使用默認的事件,以及你可以發出自己的。
這麼一個最常見的是finish(在node.0.8.12及以上end)事件:

res.on('finish', function() { 
    // request processing finished 
}); 

,如果你願意,你可以附上事件的所有請求,或在特定的根源早
另外,您可以創建中間件,這將獲得數據庫連接,並附加finish事件並可能超時。然後你需要的只是將這個中間件添加到路由中,所以最少需要重複編碼。

同時,我建議您不要爲每個請求創建數據庫連接,因爲這是一個很大的開銷和不必要的套接字以及IO處理程序的使用。您可以自由使用單一連接,從性能的角度來看,效率會更高。

+0

+1表示可能不需要爲每個請求創建數據庫連接。這與其他服務器環境有所不同,主要是因爲Node.js使用單個線程。 –

+0

單線程+您可以簡單地訪問請求範圍之外的變量和內容。你可以有一些甚至共享的數據,或類似的東西。雖然例如在PHP中,每個線程 - 完全相互隔離 - sux。 – moka

+0

非常酷,不知道這個事件存在 – Plato