Express的res.end()如何工作?

时间:2015-02-03 01:29:16

标签: javascript node.js express

docs并没有真正说出来。

  

结束响应过程。继承自Node的http.ServerResponse。

     

用于在没有任何数据的情况下快速结束响应。如果需要响应数据,请使用res.send()和res.json()等方法。

res.end();
res.status(404).end();
  1. 那么发送给客户的是什么?我感觉状态行和标题已发送,但没有发送正文。为什么他们会给出res.status(404).end()的例子。

  2. 如果您向res.end()提供参数,它是否会发送您在响应正文中提供的参数,例如节点response.end()

3 个答案:

答案 0 :(得分:2)

当您发回信息时,您必须结束信息流。您可以致电end()来完成此操作。发送状态代码404仍然可以跟随内容,例如自定义404页面,而不是显示默认This page can not be foundOld, 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()做了什么?

  1. 如果尚未发送HTTP响应标头,则会将其写入响应流。
  2. 如果使用end()参数调用data,则数据会传递到write()
  3. 如果需要发送trailers,则会将这些内容写入响应流。
  4. 在响应对象上发出finish事件,其中包括:

    • 如果连接使用keep-alive,则节点开始处理下一个HTTP请求。
    • 否则,底层TCP套接字将关闭。
  5. 所以回答你的问题:

    1. 是否有任何东西发送给客户?这取决于。调用end()永远不会导致发送额外的有效负载(实体 - 主体)数据,但根据您在调用end()之前对响应所做的操作,更多字节可能代表您逐个节点写入底层套接字。

      你的直觉是正确的; res.status(404).end()将导致服务器响应HTTP 404标头和Content-Length零(完全空体)。

    2. 是的,传递给end()的数据会写入响应流,因为end()方法节点的。重要的是要记住,表达的请求和响应对象只是常规的http.IncomingMessagehttp.ServerResponse个对象,这些对象通过以additional functionality的形式进行扩充。额外的方法。节点核心提供的所有方法仍然可用。

答案 2 :(得分:0)

我只是意识到当用res.end( )结束流而没有传递任何数据时,并没有按预期结束该流。在呈现文件并与之一起发送数据的情况下,会发生这种情况,您必须显式调用res.end( JSON.stringify( {data: data} ) )。我不知道是否有人遇到过类似情况。没在文档中找到它,我花了一些时间弄清楚为什么渲染花了这么长时间却没有成功。