在expressjs的自定义错误处理程序中以正确的方式结束响应



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 })
}
在这一点上,我不确定这个例子是否真的结束了响应。当最后一个自定义时是否已经结束?错误处理程序调用。status()和。render() ?

文档进一步说明

res。结束([data] [, encoding])结束响应过程。这个方法实际上来自Node核心,特别是http.ServerResponse的response.end()方法。用于在没有任何数据的情况下快速结束响应。如果你需要用数据来响应,可以使用res.send()和res.json()等方法。

这对我来说意味着,例如send()将结束响应。在retify中,它是建立在express之上的,它的文档声明

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

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

我希望我们要么必须

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

在我们通过

向客户端编写响应之后
  • res.status()或
  • res.status(…).res.send(…)或
  • res.send(…)或

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

res.send内部调用res.end,res.status只设置HTTP状态,不调用res.end。对于res.render,它取决于回调函数。默认回调使用res.send输出渲染(暗示res.end),或者在呈现错误的情况下使用next(err)

因此res.send,res.endres.render(使用默认回调)将结束响应。

相关内容

  • 没有找到相关文章

最新更新