2014-01-14 93 views
1

新手ExpressJS問題:域的NodeJS和expressjs

我創造一個相當簡單(但大)ExpressJS項目響應REST請求,並只讀數據庫的響應計劃。我已經閱讀了關於捕獲錯誤的NodeJS域,但我不清楚我需要這個項目。我的測試似乎表明,即使在最壞的未捕獲的拋出和崩潰中,只有單個REST請求失敗,而不是整個服務器。

我正確嗎? NodeJS Domain API:http://nodejs.org/api/domain.html#domain_class_domain

(很明顯,我問的原因是域功能很難在項目結束後實現)。

這篇文章給我留下了冷漠的感受,如果不需要的話,可以使用NODEJS for Express的想法:(我不會使我的代碼複雜化,如果不需要的話)。

Node.js - Domain per Express request, inside another domain

回答

3

獲取域的工作是與此模塊少了很多工作:https://github.com/brianc/node-domain-middleware

除此之外,儘管只有單個請求可能會失敗,但這些錯誤有時會使服務器處於不良狀態(泄漏的資源是一個示例),並且在此時重新啓動服務器被認爲是很好的形式。如果Express的內置錯誤處理程序負責處理該問題,則無法自行關閉服務器。因此,有一個原因是爲了讓域名更好,這樣您就可以在代碼中擁有一個很好的點來捕獲該域名。上述中間件在將主錯誤處理代碼從主流中抽出並保持清潔方面做了很多工作。

結合forky,事情會變得更好。

+0

這個工程很好,很容易安裝。 BrainC還爲他保留了Postgress的pg模塊。偉大的工作Brian。順便說一句:對我來說,這應該被包裝到核心ExpressJS功能中。 –

+0

這個人做的很好。 – juanpaco

2

通過分配每個速成請求單獨的域,您可以:

  • 獲取有關該錯誤信息意義:這是什麼觸發它的查詢,該用戶所做的請求等

  • 在重新啓動服務器之前,請稍等一些時間才能成功完成其他請求。這就是node.js文檔中this example的要點。

但是,你必須要小心,因爲調用第三方模塊如Node-MySQL能夠讓你切換到不同的域沒有意識到這一點。

我始終在呼喚一個異步模塊之前使用此:

exports.preserveDomain = function (fun) { 
    var d = process.domain; 

    return function() { 
    var args = arguments; 

    d.run(function() { 
     fun.apply(null, args); 
    }); 
    }; 
}; 

我給說說這個問題。如果您有興趣,請檢查the slides

0

可悲的是,節點域現在已經過時,所以你可能不應該使用它們(你也不應該使用這個中間件):(

https://nodejs.org/api/domain.html

爲了克服這個缺點,我創建了基於協同程序庫寫入異步代碼:https://github.com/vacuumlabs/yacol。如果你在你的項目中使用它,你可以擁有所有的領域善良與周圍相當體面的語義。