2014-02-15 48 views
0

比方說,我有一個mongoose調用來從數據庫中檢索一些文檔。我有兩種情況:如果回調中存在錯誤,我是否需要調用next()?

  1. 如果我要在數據庫中調用返回後執行callback功能,例如任何特定的行爲

    function(err, model) { 
        if(err){ 
         do some specific behavior in this case 
         ??? 
        } 
        ...do something with the model. 
    }) 
    

    在這種情況下,我稱next(err)???或者我乾脆什麼都不做,要處理的錯誤會傳播到中間件?

  2. 如果我不想在數據庫調用返回後執行callback函數中的任何特定行爲,例如,

    function(err, model) { 
        ...do something with the model. 
    }) 
    

    所以如果發生錯誤,我只想讓我的中間件來處理它。我需要在這裏撥打if (err) next(err)嗎?

回答

0

您應該經常檢查錯誤。假設你的數據庫已關閉。在第二種情況下,您將嘗試對模型進行一些操作,而不進行err測試。並沒有模型,因爲數據庫已關閉,並且您的整個應用程序崩潰。

至於接下來的調用,這取決於你的貓鼬呼叫的位置。如果它是一個express/connect中間件,那麼你必須調用它,如next(err)或next(null,result),這取決於你是否有錯誤。

如果你在一個路由處理程序(帶有req和res)內部執行它,再次需要res.end()以防發生錯誤或請求仍然處理。

最好的情況是如果你在模塊中有這個調用。所以在這個模塊中,你正在導出一個函數來完成這個數據庫調用。如果該函數是用回調來設計的,並且如果您遵循通常的(err,result)模式,那麼您應該檢查回調並在存在時調用它。

+0

我以爲當一個錯誤拋出後,其餘的代碼不會執行。所以回調中的參數不是拋出的錯誤,只是數據庫返回的'Error'對象? – Pio

+0

我想要處理中間件中的錯誤,我在這裏記錄錯誤並簡單地返回類似'express'缺省錯誤處理程序的錯誤頁面。 – Pio

+0

不,如果你的調用有錯誤,而你以後嘗試用那個不存在的對象執行某些事情,你的應用就會崩潰 - 因爲你沒有處理那個錯誤。如果出現問題,中間件將重定向到錯誤頁面,這就是爲什麼您可以使用錯誤作爲第一個參數調用next()。然後表達/連接知道你在中間件有錯誤,他們可以顯示錯誤頁面。 – Zlatko

相關問題