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.end
和res.render
(使用默认回调)将结束响应。