快速错误处理和异步等待
在我的Node.js应用程序中,我添加了下面的代码来捕获每个未捕获的异常:
process.on('uncaughtException', function (err: Error) {
try {
logger.err(err);
} catch (err) {
}
});
问题在于Express有它自己的默认错误处理程序,它捕获每个未捕获的异常。 现在,Express在Node(process.on)之前捕获了异常,所以我的记录器没有达到。 但是,可以添加另一个错误处理程序,它可以在执行Express之前捕获每个异常:
app.use(logErrors);
function logErrors (err: Error, req: Request, res: Response, next: NextFunction) {
logger.err(err);
next(err);
}
这仍然不包括每一个案例。 每当我有一个async function
与await
调用时,没有例外,但是被拒绝的Promise被返回。 例如:
app.get('/foo', async function (req: Request, res: Response, next: NextFunction) {
await bar();
});
function bar() {
throw new Exception();
}
将不会达到我的logErrors
函数,因为它不会抛出,但会返回一个被拒绝的Promise。
为了解决这个问题,我用另一个函数包装了我的Express HTTP处理程序:
app.get('/foo', wrap(async function (req: Request, res: Response, next: NextFunction) {
await bar();
}));
function wrap(func: (req: Request, res: Response, next: NextFunction) => void) {
return async function (req: Request, res: Response, next: NextFunction) {
try {
await func(req, res, next);
}
catch (err) {
next(err);
}
}
}
next(err)将错误传递给我的处理程序。 现在,我设法捕捉我的logErrors
函数的异常。
我就快完成了。 我仍然有一个我无法捕捉错误的案例。 当我在没有await
关键字的情况下调用async function
时,会发生这种情况(在代码的两个不同位置使用相同的函数有时很有用,一次异步调用,一次同步)。 所以这段代码不会发现错误:
app.get('/foo', wrap(async function (req: Request, res: Response, next: NextFunction) {
bar();
}));
这里发生的事情是Express HTTP处理程序将解析的Promise返回给wrap
函数。 wrap函数反过来也没有到达catch
块,所以它不会调用next(err)
,它会到达我的记录器。
bar
函数依次返回一个被拒绝的Promise,但是没有人等待它的返回值。
我怎样才能以这样的方式更改我的代码?我不会以未处理的Promise拒绝为结束? (只有通用解决方案)
还有另一个process.on
事件可以为 - unhandledRejection设置一个监听器。
您可以使用它来处理代码中的所有拒绝。
注意 :请记住在记录所有需要的内容后终止您的过程。 更多关于这里。
我找到了一个解决方案:
app.get('/foo', async function (req: Request, res: Response, next: NextFunction) {
dontAwait(() => bar());
});
async function dontAwait(func: () => void) {
try {
await func();
}
catch (err) {
logErrors(err);
}
}
我仍然有一个我无法捕捉错误的案例。
你可以,但是你现在根本就不会对结果做任何事情。 如果你想要通常的错误处理程序触发,你需要await
它。
当我在没有await
关键字的情况下调用async function
时会发生这种情况
我看不出有什么好的理由。 但是,如果你真的想开枪并忘记这个功能,你可以做到。 你只需要明确地处理错误:
bar().catch(e => logger.err(e));
链接地址: http://www.djcxy.com/p/37933.html