以下是处理 3 类错误的简短示例:
1)传递给next()处理程序,
2)在路由处理程序内部抛出,
3) 从路由处理程序调用的某些函数的回调中出现未处理的错误。
(1) 和 (2) 使用自定义错误中间件处理程序 (A) 捕获,(3) 由 uncaughtException 处理程序 (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
典型的错误是将错误处理程序放在路由定义之前,但根据您的描述,情况并非如此。
要找到问题,您可以尝试将自己的代码减少到与我相同的大小,我认为问题会变得很明显。
更新
此外,如果我尝试运行您提供的代码(稍作修改),它对我有用:
'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 错误处理程序的输出。