2013-02-20 27 views
4

我對domain模塊有問題。目前,我試圖捕獲請求中引發的任何未捕獲的錯誤。使用express中間件和域。在撥打next並轉到正確的路線之前,所有請求都通過此功能路由。無法在適當的時間在域上調用處置

app.use (req, res, next) -> 
    domain = createDomain() 
    domain.on "error", (err) -> 
     res.send(500) 
     domain.dispose() 

    domain.enter() 
    next() 

問題是,如果從不拋出錯誤,我該如何處置域?

我扯起middlewear外域和事件,所以我不曾經有部署,但後來我將無法訪問,我需要發送500

沒有人有middlewear ARGS我如何處理這個問題的更好的解決方案?我花了太多時間試圖找出一種方法來處理這個問題(以及很多奇怪的方法)。謝謝。

回答

5

如果沒有發生錯誤,則不需要撥打domain.dispose()domain.dispose()的目的是清理在跳出堆棧中間後處於不確定狀態的任何資源,並且抑制由於錯誤狀態而導致的後續錯誤。 domain.enter()的反向調用只是domain.exit()

也就是說,通過瀏覽域的代碼,它看起來像你不想用這種方式使用domain.enter/。每個domain.enter/exit對應於域模塊代碼中共享數組的堆棧推送/彈出。因此,例如,如果第二個請求在第一個請求完成之前進入,然後第一個請求在第二個請求完成之前退出,則在第一個域處理程序中調用exit將彈出第二個請求的域。進入和退出似乎很有可能不應該在異步事物上分開。

您是否嘗試過簡單地使用domain.run(next)?這似乎爲我做了詭計。它基本上爲你進入域,然後調用你給它的回調,然後在回調返回後立即退出域。您在域中創建的任何計時器或事件發射器也將自己與該域關聯。事件發射器在調用事件處理程序時也使用類似的輸入 - 呼叫 - 退出模式。它出現在代碼中,它不是跟蹤事件處理程序的域,而是跟蹤域的事件處理程序。

簡而言之,不要試圖將輸入和配置配對,也不要嘗試在異步邊界之間使用輸入/輸出。使用運行/綁定/添加/刪除。

+0

謝謝。當我有機會的時候,我會給這個機會。 – Trevor 2013-03-06 18:16:51

+0

@Jason - 你知道爲什麼'process.domain'是'undefined',只要我嘗試在我的中間件中使用貓鼬函數?看起來process.domain不是undefined util我在中間件中做了這樣的事情: 'UserModel.findOne(function(err,function(){console.log(process.domain); // undefined});' – ragulka 2013-03-26 08:54:14

+0

@ragulka請參閱https://github.com/LearnBoost/mongoose/pull/1337 – sandinmyjoints 2013-12-08 21:55:39

相關問題