【问题标题】:How do you handle errors thrown from third-party middleware in express?如何处理 express 中第三方中间件抛出的错误?
【发布时间】:2022-01-09 08:44:39
【问题描述】:

我们以这个 sn-p 为例

const express = require('express')
const bodyParser = require('body-parser')

const app = express()

app.use(bodyParser.urlencoded({ extended: false }))


app.get(...)

# all my routes #

app.use(function (err, req, res, next) {
    console.error(err.stack)
    res.status(500).send('Something broke!')
})

app.listen(9000)
....

如果 body-parser 抛出错误?

可能是客户端关闭了连接或者请求负载过大

客户端将收到来自默认快速错误处理程序的状态码为 500 的错误,但它可能是应返回 4xx 响应的错误。

我想在它之后放置一个中间件并调用 res.send 并返回错误和状态码 400。

也许用 try-catch 处理程序包装我所有的 3rd 方中间件

或者在我的错误处理程序中间件中添加一个巨大的开关盒 随着时间的推移,添加中间件第三方中间件抛出的错误并将状态码更改为 400

所有解决方案都不是真正的螺栓证明,需要随着时间的推移进行维护

对我们的最佳实践有什么建议?

【问题讨论】:

    标签: node.js express error-handling server middleware


    【解决方案1】:

    body-parser 模块在遇到错误时应该调用next(err),然后您可以通过提供Express error handler 来拦截它,例如:

    app.use(function(err, req, res, next) {
      console.error(err.stack)
      res.status(500).send('Put your content here')
    });
    

    当您定义这个特殊的中间件(带有四个参数)时,Express 将单独跟踪它作为一个错误处理程序,当/如果某些请求处理程序调用 next(err) 或如果 Express 捕获到同步异常时应该调用该错误处理程序.

    Express 有一个默认的错误处理程序,如果你没有提供一个你可以阅读关于here 的错误处理程序。但是,如果你提供一个,那么你的将接管,你可以从错误处理程序中做任何你想做的事情。您甚至可以只记录错误并将用户带到错误页面 - 如果它是网页请求,您甚至不必发送 http 错误状态。如果它是 API,您可能应该使用 http 错误状态。

    最佳做法是什么?

    最佳做法是包含您自己的 Express 错误处理程序,您可以在其中拦截发送到 next(err) 的所有错误。

    我想在它之后放置一个中间件并使用错误和状态代码 400 调用 res.send 或者可能使用 try-catch 处理程序包装我所有的第 3 方中间件

    您的第三方中间件需要在 Express 生态系统中正常运行。这意味着它可以同步抛出,Express 会自动捕获它并发送到 Express 错误处理程序。代码不应该异步抛出(对于所有类型的代码都是如此),因为没有人可以捕获这些异常(除非它们在 Promise 结构的代码中)。您不必自己包装中间件。

    内部错误一般不应该是 4xx 错误,而是 5xx 错误。您是否将内部错误显示给最终用户完全取决于上下文。通常,会向用户显示某种通用错误页面。或者,如果它是一个 API,该 API 将有一个用于传达错误的方案,并且通常该 API 将返回适当映射到问题类型的实际 http 状态代码。

    【讨论】:

    • @NaorTedgi - 这对你有用吗?
    • 您的回答非常有用,非常感谢,但我正在寻找代码实现示例
    • @NaorTedgi - 我提供了一个示例,我给您的文档链接显示了一个示例。记下你还想要什么?
    【解决方案2】:

    经过进一步调查,这是最适合我的解决方案 只需在正文解析后添加另一个中间件

    https://www.npmjs.com/package/express-body-parser-error-handler

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      相关资源
      最近更新 更多