{ -6ren">
gpt4 book ai didi

node.js - promise - 未处理的拒绝挂起请求

转载 作者:太空宇宙 更新时间:2023-11-03 22:27:57 24 4
gpt4 key购买 nike

我正在 Node.js 中开发后端应用程序,遇到以下问题:当开发人员调用如下 Promise 函数时:

mainRouter.get("/xD", async (req, res) => {
res.send(await this.fooService.foo());
});

this.fooService.foo() 函数可能会失败( promise 拒绝),并且最终用户将收到请求超时。

我想确保开发人员的错误不会导致 UnhandledPromiseRejectionWarning (以及最终的超时错误)。问题是如何配置应用程序以记录错误并在发生 UnhandleRejection 时向用户返回状态 500。

我尝试过的:

mainRouter.get("/xD", async (req, res) => {
try {
res.send(await this.fooService.foo());
} catch (err) {
res.status(500).send("error");
}
});

上面的代码可以做到这一点,但它要求开发人员在每个路由中编写上面的代码,所以这不是一个干净的解决方案。

我还尝试使用错误中间件:

mainRouter.use((err:any, req, res, next) => {
console.log(err);
res.status(500).send("Error");
});

但它没有捕获 PromiseRejection

最后我创建了中间件,为 unhandledRecejtion 事件注册函数处理程序:

mainRouter.use((req, res, next) => {
process.on('unhandledRejection', (reason, p) => {
console.log(reason);
res.status(500).send("Error");
});
next();
});

我不确定流程事件在node.js中是如何工作的,但我担心上面的代码会导致场景出现问题:

  1. 第一个请求会生成未处理的 Promise 拒绝
  2. 最后注册处理程序的最新请求将返回用户状态 500。

最佳答案

为什么不直接提供一个每个人都可以使用的包装函数

async function wrapAsync(res, asyncFn) {
try {
res.send(await asyncFn());
} catch (err) {
res.status(500).send("error");
}
}

其中 asyncFn 是一个返回 Promise 的函数

然后其他开发者就可以简单地这样使用它

mainRouter.get("/xD", async (req, res) => await wrapAsync(res, this.fooService.foo));

也可以覆盖 mainRouter.get 并提供更短的抽象

关于node.js - promise - 未处理的拒绝挂起请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42751133/

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