【问题标题】:ExpressJs send response with error inside middlewareExpressJs 在中间件内发送错误响应
【发布时间】:2022-01-25 03:25:40
【问题描述】:

我不明白为什么我的 ExpressJs 应用程序在中间件中发送 res.status(401) 时会崩溃。

假设我的 start.js 有:

app.use(middlewares.timestampValidator());

中间件声明如下:

timestampValidator: () => {

return (req, res, next) => {

    [...]
    if(error) {
        res.status(401).json(new ServerResponse());
    }
    else {
        next();
    }
}
}

当错误成功地发送到客户端时,服务器会因此错误而崩溃:

节点:内部/进程/承诺:246 triggerUncaughtException(err, true /* fromPromise */); ^

[UnhandledPromiseRejection:此错误源于在没有 catch 块的情况下抛出异步 > 函数内部,或拒绝未使用 > > .catch() 处理的承诺。承诺被拒绝,原因是“假”。] { 代码:'ERR_UNHANDLED_REJECTION' }

但函数不是异步的。 我尝试在发送状态 401 后调用 next('error');,但应用程序继续路由,然后响应无法发送到客户端,因为已经发送。

【问题讨论】:

  • 如果您注释掉 app.use(middlewares.timestampValidator()); 行 - 仍然以同样的方式崩溃?我想知道问题是否来自与代码不同的地方。
  • new ServerResponse() 是做什么的?
  • 如果您能够在 github 上以最小样本复制错误,则可以保证解决您的问题。

标签: javascript node.js express


【解决方案1】:

如果您正在使用错误处理中间件,则应将错误传递给错误处理程序。这可以防止“UnhandledPromiseRejection”。

if(error) {
    next(new ServerResponse());
}
else {
   // continue ... 
}

如果您没有使用错误处理中间件,则在 try/catch 块中抛出错误 ( new ServerResponse() )

【讨论】:

    【解决方案2】:

    我在我的 nodejs 应用程序中得到了同样的东西。我的中间件在应用程序中崩溃了,在崩溃一段时间后,引发了 unhandlesPromiseRejectionException。中间件不是异步的,但是这个崩溃正在停止代码的执行(如果没有使用 try catch 来处理它),从而终止整个进程,然后在一段时间后引发异常。

    如果您注意到客户端收到错误的时间,您可以看到您更快地在客户端收到错误,并且稍后会引发 PromiseException。 请您检查一下,您在客户端遇到的错误是超时错误,还是您抛出的错误代码

    我认为 Express 只是在中间件中引发未处理的异常作为 unhandledPromiseRejection 默认情况下,因为它是其 api hittin 进程的中断,默认情况下是异步的。即使您的中间件是同步的,但它被放置在 API 路由的异步进程中,如果其中有任何未处理的崩溃,它会引发 UnhandledPromiseRejectionException,因为它是异步进程中的崩溃。

    试着把它想象成这样:-

    public async randomeFUnction()
    {
    syncFUnction1()
    syncFUnction2()
    await asyncFUnction()
    }
    

    现在如果syncFunction1崩溃,它仍然会是一个unhandledPromiseException,虽然主堆栈跟踪导致一个sunchronous方法,但本质上,randomeFunction是失败的,它是一个异步函数。

    我建议使用 try catch 来防止正式崩溃,而不是使用 If 条件。

    如果有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-12
      • 2017-04-10
      • 1970-01-01
      • 2018-09-16
      • 2023-02-14
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多