你應該永遠不會丟這樣的錯誤! :)原因是,在某些時候,您的整個節點應用程序將停止工作,因爲某些數據庫查詢失敗。這應該被處理,而不是隻是死。
而且因爲這是一個route
處理程序 - 處理用戶正在獲取的特定url(例如/
),應該有一些輸出。如果出現這樣一個你無法處理的錯誤,或者你的內部狀態可能混亂,你總是可以顯示狀態爲500
的頁面和一個不錯的設計。
所以基本上只是沒有任何事情發生 - 返回任何一種respones
,甚至render
頁面,但提供的信息出了問題。
另外,一個常見的場景就像Alon Oz提供的一樣。所有express的路由實際上都是一箇中間件函數,它們被一個接一個地調用。如果路線與請求路線不匹配,則該功能會跳過並調用下一個路線。你可以手動控制。路由器的實際模式是這樣的:
app.get('/', function(req, res, next) {
// you can have the request
// you can send response like res.send('hello')
// OR you can skip this function using NEXT
});
接下來的實際簽名是next(err)
。所以,如果你沒有任何爭論的話,它只會跳到下一個中間件。如果使用參數調用它,它將跳過所有常規函數並轉到堆棧中的最後一個函數,或者更具體地說,處理錯誤的函數。他們就像普通的人,但採取四個參數,而不是三個:
app.use(function (err, req, res, next) { });
明白,這個函數將被調用,如果你電話下一個有爭論這是非常重要的。拋出一個錯誤將無濟於事!當然,如果你的路線都不符合特定的標準(url),那麼最後一個路線將被調用,所以你仍然可以處理「not found」錯誤。
這是您將使用一個常見的場景:
// development error handler, will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
debug('ERROR [ip: %s]:: dev env -> ', req.ip, err); // I'm using debug library - very helpful
res.status(err.status || 500);
res.render('deverr', { // I render custom template with the whole stack beautifully displayed
errMessage: err.message,
error: err
});
});
}
// production error handler, no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('pages/error', { // custom error page with nice design and a message
errMessage: err.message,
error: {}
});
});
希望幫助!:)
我發現迄今爲止在Express和Node中異步錯誤處理的最佳資源是StrongLoop的這篇博文https://strongloop.com/strongblog/async-error-handling-expressjs-es7-promises-generators/團隊落後於Express。 – korun