Node.js 承诺-未处理的拒绝挂起请求
我正在Node.js中开发一个后端应用程序,遇到以下问题:当开发人员调用如下承诺函数时:Node.js 承诺-未处理的拒绝挂起请求,node.js,express,promise,async-await,Node.js,Express,Promise,Async Await,我正在Node.js中开发一个后端应用程序,遇到以下问题:当开发人员调用如下承诺函数时: mainRouter.get("/xD", async (req, res) => { res.send(await this.fooService.foo()); }); 有可能this.fooService.foo()函数将失败(承诺拒绝),最终用户将获得请求超时 我想确保开发人员的错误不会导致未处理的PromisejectionWarning(最后是超时错误)。问题是如何配置应用程序,
mainRouter.get("/xD", async (req, res) => {
res.send(await this.fooService.foo());
});
有可能this.fooService.foo()
函数将失败(承诺拒绝),最终用户将获得请求超时
我想确保开发人员的错误不会导致未处理的PromisejectionWarning(最后是超时错误)。问题是如何配置应用程序,以便在发生未处理的删除时记录错误并将状态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");
});
但它并没有抓住你
最后,我创建了中间件,它为未处理的Receijtion事件注册函数处理程序:
mainRouter.use((req, res, next) => {
process.on('unhandledRejection', (reason, p) => {
console.log(reason);
res.status(500).send("Error");
});
next();
});
我不确定node.js中的流程事件是如何工作的,但我担心上面的代码会给场景带来问题:
为什么不提供一个每个人都可以使用的包装器函数呢
async function wrapAsync(res, asyncFn) {
try {
res.send(await asyncFn());
} catch (err) {
res.status(500).send("error");
}
}
其中asyncFn是一个返回承诺的函数
然后其他开发人员可以简单地以这种方式使用它
mainRouter.get("/xD", async (req, res) => await wrapAsync(res, this.fooService.foo));
也可以覆盖主路由器。获取并提供更短的抽象“开发人员需要在每个路由中编写上述代码”-然后将抽象放入获取本身您确定等待可以用于非异步功能吗?