如何在錯誤的情況下正確結束中間件鏈?如何阻止中間件鏈?
在我的代碼有
if (someProblem) {
res.status(statuscode).json({message: 'oops'});
return;
}
然而,中間件在鏈中不斷得到叫給我Can't set headers after they are sent
錯誤之後。
如何在錯誤的情況下正確結束中間件鏈?如何阻止中間件鏈?
在我的代碼有
if (someProblem) {
res.status(statuscode).json({message: 'oops'});
return;
}
然而,中間件在鏈中不斷得到叫給我Can't set headers after they are sent
錯誤之後。
中間件不會自行前進。只要您撥打next()
,只要您不撥打next()
,它就會進入鏈中的下一步,那麼下一步將不會執行。
所以,如果您只是發送回覆並返回(不需要致電next()
),那麼您應該沒有問題。
您在問題中顯示的代碼本身並不會導致您引用的錯誤消息,因此必須進行更多的操作以避免發生錯誤。
準確的記憶會發生什麼?會泄漏嗎? – AiShiguang
@AiShiguang - 內存沒有問題。發送響應將完成http連接並關閉它。請求處理程序只是一個靜態的函數引用數組,當調用next()來查找鏈中的下一個時,會查詢它。跳過其中一些功能不會以任何方式改變內存使用情況。 – jfriend00
如果你想讓你的中間件不去鏈的下一步,但要返回錯誤,你必須調用next(error)
回調。
這將調用錯誤處理程序中間件,您可以在該錯誤處理程序中間件中操作錯誤並將其返回給客戶端,如果這就是您想要的。
要實現自定義錯誤處理程序可以直接使用中間件handleError(err, req, res, next)(error, req, res, next)
所以你只需要連接設置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');
});
鏈只有當你打電話時纔會發生,否則它會停止 – Simon
你是對的。謝謝 – Lev