gpt4 book ai didi

javascript - 快速错误处理和异步等待

转载 作者:IT老高 更新时间:2023-10-28 23:26:52 26 4
gpt4 key购买 nike

在我的 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);
}

这仍然不能涵盖所有情况。每当我有一个使用 await 调用的 async function 时,没有异常(exception),但会返回一个被拒绝的 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 block ,因此它不会调用将到达我的记录器的 next(err)

bar函数依次返回一个被拒绝的Promise,但是没有人在等待它的返回值。

我怎样才能更改我的代码,以免最终导致任何未处理的 Promise 拒绝? (仅通用解决方案)

最佳答案

还有另一个 process.on 事件可以设置监听器 - unhandledRejection .

您可以使用它来处理所有代码中的这些拒绝。

注意:请记住在记录所需的所有内容后终止进程。更多信息 here .

关于javascript - 快速错误处理和异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41570031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com