docs并没有真正说出来。
结束响应过程。继承自Node的http.ServerResponse。
用于在没有任何数据的情况下快速结束响应。如果需要响应数据,请使用res.send()和res.json()等方法。
res.end();
res.status(404).end();
那么发送给客户的是什么?我感觉状态行和标题已发送,但没有发送正文。为什么他们会给出res.status(404).end()
的例子。
如果您向res.end()
提供参数,它是否会发送您在响应正文中提供的参数,例如节点response.end()?
答案 0 :(得分:2)
当您发回信息时,您必须结束信息流。您可以致电end()
来完成此操作。发送状态代码404
仍然可以跟随内容,例如自定义404
页面,而不是显示默认This page can not be found
(Old, but an example of Chrome's built-in 404 page)的浏览器。如果您没有结束请求,浏览器将继续等待流的结束并在一段时间后报告超时。
res.send()
会自动关闭您的请求,因此您无需手动拨打end()
。
答案 1 :(得分:2)
如果我们查看source,我们会发现express实际上并未提供end()
方法。这就是文档“继承自Node的http.ServerResponse”告诉你 - express没有提供这种方法; node core's http module does
那么http end()
做了什么?
end()
参数调用data
,则数据会传递到write()
。在响应对象上发出finish
事件,其中包括:
所以回答你的问题:
是否有任何东西发送给客户?这取决于。调用end()
永远不会导致发送额外的有效负载(实体 - 主体)数据,但根据您在调用end()
之前对响应所做的操作,更多字节可能代表您逐个节点写入底层套接字。
你的直觉是正确的; res.status(404).end()
将导致服务器响应HTTP 404标头和Content-Length
零(完全空体)。
是的,传递给end()
的数据会写入响应流,因为end()
方法是节点的。重要的是要记住,表达的请求和响应对象只是常规的http.IncomingMessage
和http.ServerResponse
个对象,这些对象通过以additional functionality的形式进行扩充。额外的方法。节点核心提供的所有方法仍然可用。
答案 2 :(得分:0)
我只是意识到当用res.end( )
结束流而没有传递任何数据时,并没有按预期结束该流。在呈现文件并与之一起发送数据的情况下,会发生这种情况,您必须显式调用res.end( JSON.stringify( {data: data} ) )
。我不知道是否有人遇到过类似情况。没在文档中找到它,我花了一些时间弄清楚为什么渲染花了这么长时间却没有成功。