【问题标题】:Handling PromisesRejections inside Express middleware在 Express 中间件中处理 PromisesRejections
【发布时间】:2019-11-11 21:55:02
【问题描述】:

我想使用中间件函数处理未处理的 Promises Rejections,因为我必须知道请求的 Request 和 Response 对象。

我写了如下代码,但是当代码抛出未处理的Promise时,好像没有调用中间件/process.on函数。

所以,我的问题是:是否可以使用中间件处理 Promise Rejections 或(或者)获取请求的 Request / Response 对象,在未处理的异常情况下导致错误?

我尝试将中间件作为我的应用程序的第一个中间件,但没有结果:它根本没有被调用。

app.use ( ( err: Error, req: ILRequest, res: ILResponse, next: ILNextFunction ) =>
    {
        console.log ( "\n\n***** OUTSIDE ERR: ", err );

        process.on ( 'unhandledRejection', ( error: any ) =>
        {
            console.log ( "\n\n------ ERROR " );
        } );
    } );

【问题讨论】:

    标签: node.js express exception promise


    【解决方案1】:

    中间件仅在 HTTP 请求上调用。如果你想试试process.on('unhandledRejection') 把它放在“顶层”——应该只有一个。但是,要将这些值中的任何一个放入 http 响应中,您必须存储一个全局错误(或错误数组)并让另一个 HTTP 请求检查错误数组。或者查看您的服务器日志。

    您可以编写中间件来处理被拒绝的承诺,使用适当的值调用next。比如:

    app.use( (err, req, res, next) => {
      promiseThing
      .then( (good) => {
        // do something with good value
        next()
      })
      .catch (err) {
        next(err)
      }
      // could be written shorter as .catch(next)
    })
    

    【讨论】:

    • 我想要做的,实际上是为未处理的承诺提供一个 default 后备方案,如果在代码中没有正确处理,这些承诺通常会使 Express 应用程序崩溃。感谢您的回复,但如果我理解正确,这不是我要找的,因为它是单一承诺的“本地”。我的软件只处理 HTTP 请求,所以它是完美的场景。
    • 这听起来很有趣,我不确定这是否可行,并会关注其他答案。您可以尝试使用像 app.use( async function errorCatcher(err,req,res,next) { try{ next() } catch (e) { next(e) } } 这样的中间件,如果出现意外错误,它可能会链接回来。我有一段时间没有使用 Express,所以不确定如何在您的场景中最好地处理它。
    • 你建议的中间件对我来说是真正的黑魔法(为什么在中间件中有一个异步函数什么都不做......)但它不起作用。作为第一个中间件和最后一个中间件进行了测试,但没有成功。无论如何感谢您的支持。
    • 目的是让一些东西捕捉到链条中的任何错误。你可能看到了这个链接:expressjs.com/en/guide/error-handling.html,这里还有一个博客gist.github.com/zcaceres/2854ef613751563a3b506fabce4501fd。那个博客可以吗?无论如何,好看,我离 Express 太远了,无法提供更多帮助!
    猜你喜欢
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 2016-10-08
    • 2012-02-22
    • 2018-04-01
    • 2022-06-20
    相关资源
    最近更新 更多