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(最后是超时错误)。问题是如何配置应用程序,

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

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中的流程事件是如何工作的,但我担心上面的代码会给场景带来问题:

  • 第一个请求生成未处理的承诺拒绝
  • 最后注册处理程序的最新请求将返回到用户状态500

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

    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));
    

    也可以覆盖主路由器。获取并提供更短的抽象

    “开发人员需要在每个路由中编写上述代码”-然后将抽象放入获取本身您确定等待可以用于非异步功能吗?