【问题标题】:Ending a response inside custom error handler in expressjs the right way以正确的方式在 expressjs 中结束自定义错误处理程序中的响应
【发布时间】:2021-10-23 13:58:15
【问题描述】:

expressjs 的官方文档https://expressjs.com/en/guide/error-handling.html 声明如下:

请注意,当不在错误处理函数中调用“next”时,您有责任编写(和结束)响应。否则,这些请求将“挂起”并且没有资格进行垃圾回收。

最后一个自定义处理程序的示例如下:

...
app.use(logErrors)
app.use(clientErrorHandler)
app.use(errorHandler)
function errorHandler (err, req, res, next) {
  res.status(500)
  res.render('error', { error: err })
}

此时我不确定这个示例是否真的结束了响应。 当最后一个 custom 错误处理程序调用 .status() 和 .render() 时,它是否已经结束?

文档进一步说明

res.end([数据] [, 编码]) 结束响应过程。这个方法其实来自Node核心,具体是http.ServerResponse的response.end()方法。 用于在没有任何数据的情况下快速结束响应。如果您需要用数据响应,请改用 res.send() 和 res.json() 等方法。

这对我来说意味着,例如send() 将结束响应。 在基于 express 的 restify 中,文档指出

与其他 REST 框架不同,调用 res.send() 不会自动触发 next()。在许多应用程序中,工作可以在 res.send() 之后继续进行,因此刷新响应并不等同于完成请求。

这就是为什么不确定,只是调用 send()、json() 或 status 是否真的足以将这些资源释放到垃圾回收

我原以为我们必须这样做

  • 不带参数调用 next()(以便默认处理程序最终结束它)或
  • res.end() 手动结束

在我们写给客户的回复之后

  • res.status() 或
  • res.status(...).res.send(...) 或
  • res.send(...) 或

在自定义错误处理程序中结束响应的正确方法是什么?

【问题讨论】:

    标签: express


    【解决方案1】:

    res.send内部调用res.end,但res.status只设置HTTP状态,不调用res.end。使用res.render,它取决于回调函数。默认回调使用res.send 输出渲染(暗示res.end),或next(err) 以防渲染错误。

    所以res.sendres.endres.render(带有默认回调)将结束响应。

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 2019-09-22
      • 2015-10-26
      • 1970-01-01
      • 2014-12-22
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多