2016-12-29 32 views
2

我期待通過快遞發生器產生app.js,並有下面的代碼:爲什麼下面的處理程序確定爲404處理器

app.use('/', index); 
app.use('/users', users); 

// catch 404 and forward to error handler 
app.use(function (req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

我的問題是,爲什麼在過去的中間件功能被確定爲函數當not found錯誤應該返回時執行?

是否基於這樣的假設:如果調用此函數,則意味着沒有其他中間件/路由器函數完成處理與res.send()的請求,因此對請求不感興趣,因此可能沒有處理請求的處理程序?如果是這樣,那麼應該總是最後添加這個處理函數,正確嗎?

+0

是的,沒錯。這是因爲它是最後一個,即*沒有更多有效的路由,因此這必須是一個錯誤。* –

+0

是的,它完全如您所述 –

回答

2

正是如你所說,在http://expressjs.com/en/starter/faq.html

表示如何處理404升的反應? 在Express中,404響應不是 錯誤的結果,所以錯誤處理程序中間件將不會捕獲 它們。這種行爲是因爲404響應只是表示 沒有額外的工作要做;換句話說,Express已經執行了所有中間件功能和路由,並且發現它們中的任何一個都不會響應 。所有你需要做的是在非常 底部的堆棧(下面的所有其他功能)的添加中間件函數來處理404 響應:

app.use(function (req, res, next) { 
    res.status(404).send("Sorry can't find that!") 
}) 
+0

謝謝,但其他一些中間件功能可能仍然寫入響應,正確? –

+2

是的,它可以寫入響應並仍然調用next()來進入下一個處理程序。 –

+0

@HunterMcMillen,謝謝 –

相關問題