Express的res.end()如何工作?
这些文件并没有太多的说明。
结束响应过程。 inheritance自Node的http.ServerResponse。
用于快速结束没有任何数据的响应。 如果您需要使用数据进行响应,请使用res.send()和res.json()等方法。
res.end(); res.status(404).end();
-
那么发送给客户的东西是什么? 我感觉到状态行和标题被发送,但没有主体发送。 为什么他们会举
res.status(404).end()
的例子。 -
如果你提供了一个参数
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()
做什么的?
- 如果HTTP响应头尚未发送,则将其写入响应stream。
- 如果使用
data
参数调用end()
,则将数据传递给write()
。 - 如果有必要发送预告片 ,则将这些预告片写入回应stream。
-
在响应对象上发出
finish
事件,其中:- 如果连接使用保持活动 ,节点开始处理下一个HTTP请求。
- 否则,底层的TCP套接字将被closures。
所以要回答你的问题:
-
有没有发送给客户? 这取决于。 调用
end()
将永远不会导致发送额外的有效内容(实体主体)数据,但根据您在调用end()
之前对响应所做的操作, 可能会有更多字节被您的节点写入底层套接字代表。你的直觉是正确的。
res.status(404).end()
将导致服务器响应HTTP 404头和一个Content-Length
为零(完全空体)。 -
是的,传递给
end()
数据被写入响应stream,因为end()
方法是节点的。 请记住,请求和响应对象expression给你提供的只是普通的http.IncomingMessage
和http.ServerResponse
对象,这些对象通过额外的方法expression而增加了一些额外的 function 。 节点核心提供的所有方法仍然可用。