2016-12-02 22 views
0

如何在錯誤的情況下正確結束中間件鏈?如何阻止中間件鏈?

在我的代碼有

if (someProblem) { 
     res.status(statuscode).json({message: 'oops'}); 
     return; 
    } 

然而,中間件在鏈中不斷得到叫給我Can't set headers after they are sent錯誤之後。

+1

鏈只有當你打電話時纔會發生,否則它會停止 – Simon

+0

你是對的。謝謝 – Lev

回答

1

中間件不會自行前進。只要您撥打next(),只要您不撥打next(),它就會進入鏈中的下一步,那麼下一步將不會執行。

所以,如果您只是發送回覆並返回(不需要致電next()),那麼您應該沒有問題。

您在問題中顯示的代碼本身並不會導致您引用的錯誤消息,因此必須進行更多的操作以避免發生錯誤。

+0

準確的記憶會發生什麼?會泄漏嗎? – AiShiguang

+0

@AiShiguang - 內存沒有問題。發送響應將完成http連接並關閉它。請求處理程序只是一個靜態的函數引用數組,當調用next()來查找鏈中的下一個時,會查詢它。跳過其中一些功能不會以任何方式改變內存使用情況。 – jfriend00

0

如果你想讓你的中間件不去鏈的下一步,但要返回錯誤,你必須調用next(error)回調。

這將調用錯誤處理程序中間件,您可以在該錯誤處理程序中間件中操作錯誤並將其返回給客戶端,如果這就是您想要的。

要實現自定義錯誤處理程序可以直接使用中間件handleError(err, req, res, next)(error, req, res, next)

0

所以你只需要連接設置ErrorHandler(這是一個函數,4個參數)創建實際的服務器實例之前。

任何地方,你現在可以簡單地用var newError = new Error('my error message');創建一個錯誤,並將其與next(newError); 傳遞給next回調停止執行的錯誤被拋出後,並沒有發送響應的應用程序使用兩次return next (newError);

// example route 
app.get('/test', function(req, res, next){ 
    if (someProblem) { 
    var newError = new Error('oops'); 
    return next(newError); 
    } 
    res.send('all OK - no errors'); 
}); 

// attach this errorHandler just before you create the server 
app.use(function(error, req, res, next){ 
    console.log(error); 
    res.status(500).json(error); 
}); 

// this is where you create the server 
var server = app.listen(4000, function(){ 
console.log('server started'); 
});