【发布时间】: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