下面是處理3種類型錯誤的簡短工作示例: 1)傳遞給next()
處理程序, 2)throw-ed在路由處理程序中, 3)在路由處理程序調用的某個函數的回調中未處理的錯誤。 (1)和(2)使用定製錯誤中間件處理程序(A)捕獲,並且(3)由處理程序(B)捕獲。
Express有,如果它使用的呼叫next()
鏈得到控制,其輸出誤差自己的錯誤處理程序(即,如果沒有定製的錯誤處理程序,或者如果它通過控制進一步使用next(err, req, res, next)
)。這就是爲什麼即使您的處理程序不是觸發器,仍然會在控制檯中收到錯誤消息。
如果您嘗試運行案例(1)和(2)的示例,您將看到錯誤輸出兩次 - 通過自定義處理程序(A)和默認的Express錯誤處理程序。
'use strict';
var express = require('express');
var app = express();
var server = app.listen(8080, function() {
console.log('* Server listening at ' + server.address().address + ':' + server.address().port);
});
// Example 1: Pass error in route handler to next() handler
app.use('/1', function(req, res, next) {
console.log('* route 1');
next(new Error('* route 1 error'));
});
// Example 2: throw the error in route handler
app.use('/2', function(req, res, next) {
console.log('* route 2');
throw new Error('route 2 error');
});
// Example 3: unhandled error inside some callback function
app.use('/3', function(req, res, next) {
console.log('* route 3');
setTimeout(function(){
throw new Error('route 3 error');
}, 500);
});
// Error handler A: Express Error middleware
app.use(function(err, req, res, next) {
console.log('**************************');
console.log('* [Error middleware]: err:', err);
console.log('**************************');
next(err);
});
// Error handler B: Node's uncaughtException handler
process.on('uncaughtException', function (err) {
console.log('**************************');
console.log('* [process.on(uncaughtException)]: err:', err);
console.log('**************************');
});
節點版本:v7.2.0
典型的錯誤是路線定義之前放置錯誤處理,而是根據你的描述,這不是這種情況。
要找到問題,您可以嘗試將自己的代碼縮小到與我的代碼大小相同,我認爲問題會變得很明顯。
UPDATE
而且,如果我嘗試運行你所提供的代碼(瑣碎的修改),它爲我工作:
'use strict';
var express = require('express');
var app = express();
var server = app.listen(8080, function() {
console.log('* Server listening at ' + server.address().address + ':' + server.address().port);
});
//process.on('uncaughtException', function (err: Error) {
process.on('uncaughtException', function (err) {
try {
console.log('*** uncaughtException:', err);
//mongoDal.log(err.message, err);
} catch (err) {
}
});
//app.get('/test_feature', function (req: Request, res: Response) {
app.get('/test_feature', function (req, res) {
makeError();
res.send("Done");
});
function makeError(){
throw new Error("asdasdad");
}
app.use(logErrors);
//function logErrors (err: Error, req: Request, res: Response, next: NextFunction) {
function logErrors (err, req, res, next) {
console.log('*** logErrors:', err);
//mongoDal.log(err.message, err);
next(err);
}
結果是(堆棧跟蹤被截斷) :
* Server listening at :::8080
*** logErrors: Error: asdasdad
at makeError (/home/alykoshin/sync/al-projects/dev/nmotw/400-express-error-handling/main-stackoverflow.js:32:9)
...........
Error: asdasdad
at makeError (/home/alykoshin/sync/al-projects/dev/nmotw/400-express-error-handling/main-stackoverflow.js:32:9)
...........
你可以在一開始看到logErrors
處理器的輸出中然後將叔他輸出默認的Express錯誤處理程序。
你是如何定義你的請求? app.get(req,res)??? –
@LucasKatayama是 – Alon
Express已經有一個默認的錯誤處理程序,這可能是記錄錯誤的處理程序。我的猜測是,你正在安裝你的錯誤處理程序,它並不是最後一箇中間件,但我不能肯定地說不知道你的應用程序是如何構建的(是'server.js'的應用程序入口點,或者你是否通過其他文件啓動應用程序?) – robertklep