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

这些文件并没有太多的说明。

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

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

res.end(); res.status(404).end(); 
  1. 那么发送给客户的东西是什么? 我感觉到状态行和标题被发送,但没有主体发送。 为什么他们会举res.status(404).end()的例子。

  2. 如果你提供了一个参数res.end() ,它会发送你在响应体中提供的参数,如Node的response.end() ?

当您发回信息时,您必须结束信息stream。 你通过调用end()做到这一点。 发送状态代码404仍然可以跟随内容,例如自定义404页面,而不是浏览器显示默认This page can not be found ( 旧的,但是Chrome的内置404页面的一个例子 )。 如果您没有结束请求,浏览器将一直等待stream的结束并在一段时间后报告超时。

res.send()自动closures你的请求,所以你不必手动调用end()

如果我们看源代码 ,我们可以看到express并没有提供end()方法。 这就是文档“从Node的http.ServerResponseinheritance”告诉你 – 快递不提供这种方法; 节点核心的http模块呢 。

那么http的end()做什么的?

  1. 如果HTTP响应头尚未发送,则将其写入响应stream。
  2. 如果使用data参数调用end() ,则将数据传递给write()
  3. 如果有必要发送预告片 ,则将这些预告片写入回应stream。
  4. 在响应对象上发出finish事件,其中:

    • 如果连接使用保持活动 ,节点开始处理下一个HTTP请求。
    • 否则,底层的TCP套接字将被closures。

所以要回答你的问题:

  1. 有没有发送给客户? 这取决于。 调用end()将永远不会导致发送额外的有效内容(实体主体)数据,但根据您在调用end()之前对响应所做的操作, 可能会有更多字节被您的节点写入底层套接字代表。

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

  2. 是的,传递给end()数据被写入响应stream,因为end()方法节点的。 请记住,请求和响应对象expression给你提供的只是普通的http.IncomingMessagehttp.ServerResponse对象,这些对象通过额外的方法expression而增加了一些额外的 function 。 节点核心提供的所有方法仍然可用。