gpt4 book ai didi

javascript - 使用异步/等待时在 Express 中捕获未处理的异常

转载 作者:数据小太阳 更新时间:2023-10-29 06:10:07 27 4
gpt4 key购买 nike

看下面的 TypeScript 代码:

app.get('/test_feature', function (req: Request, res: Response) {
throw new Error("This is the bug");
});

app.use(logErrors);

function logErrors (err: Error, req: Request, res: Response, next: NextFunction) {
console.log(err);
mongoDal.log(err.message, err);
next(err);
}

在这里,我在请求处理程序中抛出一个错误,它会按预期触发 logErrors 函数。

然后,我更改代码以使用异步函数:

app.get('/test_feature', async function (req: Request, res: Response) {
throw new Error("This is the bug");
await someAsyncFunction();
});

现在,因为我的函数是异步的,错误以某种方式被 Express 的默认错误处理程序处理,所以我的自定义错误处理程序无法访问,Node 默认错误处理程序也无法访问:

process.on('uncaughtException', function (err: Error) {
try {
console.log(err);
mongoDal.log(err.message, err);
} catch (err) {

}
});

当异步函数发生错误时,如何使我的“logErrors”函数到达?我想要一个通用的解决方案,而不是在每个请求处理程序中尝试/捕获。

最佳答案

这里的问题是您的处理程序根本不再抛出同步异常。相反,您的处理程序返回一个被拒绝的 promise 。请注意,这不是 promise 或 async/await 特定的问题,这也是任何使用回调等的快速代码的普遍问题——如果您在编写异步代码时不小心处理所有地方的错误,很容易完全丢失它们。

要在您的情况下处理此问题,需要进行 self 注册以捕获您返回的 promise 中的拒绝。有几个选项:

  1. 明确地将 .catch() 添加到所有错误处理程序,并自行处理错误,或者通过调用 next(err) 委托(delegate)给正常的快速错误处理。
  2. 为您的处理程序创建一个包装函数来执行此操作,并在任何地方使用它。您可以使用现有的 wrap() 函数,例如 express-promise-wrap为此。
  3. 扩展 .get 和 friend 以自动跟踪从处理程序返回的 promise 中的拒绝。您可以手动执行此操作,但它看起来像 express-as-promised是一个可行的实现(虽然我还没有尝试过)。

设置起来稍微复杂一些,但在我看来,设置好后最好选择 3。有了它,您应该能够将异步函数编写为处理程序,它们都将在幕后返回 promise ,并且您的处理程序代码将自动监控这些 promise 以发现任何后续失败。

StrongLoop 实际上有一篇文章对此进行了更详细的介绍,如果您想进一步阅读:https://strongloop.com/strongblog/async-error-handling-expressjs-es7-promises-generators/

关于javascript - 使用异步/等待时在 Express 中捕获未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40850299/

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