Open
Description
res.writeHead
PK res.setHeader
先看看head
和header
区别:
http
模块的类型方法命名中有head
,header
和header
,他们含义不用:
head
表示HTTP报文首部(包含:状态码,状态描述,首部字段)header
表示指定的首部字段;headers
表示所有的首部字段。
可能是因为这两个方法都可以设置报文首部字段,所以经常拿来对比两者的区别。本质上讲两者没有任何可比性,单独从功能上区分即可。
setHeader
只是单纯的设置报文头部字段;writeHead
则是发送报文首部数据,并且可以顺便设置首部数据(除了首部字段headers外,还有状态码,状态描述)。
如果更新header
并在后续还要获取,则使用setHeader
更新。
res.headersSent
哪些操作使得headersSent = true
?
res.writeHead
res.write
res.end
方式1是显示地发送报文头部,方式2,3隐式的(隐式header模式)发送报文头。
res.headersSent = true
后
不能做什么:
res.setHeader
res.writeHead
res.removeHeader
即发送headers后,不能再对header进行写的操作(新增,编辑,删除)。
能做什么:
res.write
res.end
即可以操作报文负载数据(payload)。
res.writableEnded
& res.end
的行为
writableEnded
标记res.end
是否已经执行。
res.end
必须调用。
writableEnded = true
之后
不能再写入数据了,否则报错ERR_STREAM_WRITE_AFTER_END
。还可以继续调用res.end
但是都是无效的,但是最好不要这样做。
res.writableEnded
和res.writableFinished
区别?
res.writableEnded
表示是否已经调用了res.end
方法。
res.writableFinished
表示数据是否已经发送完毕。
响应报文处理流程
一般情况下响应报文会经过这个处理流程:
res.setHeader
res.writeHead
res.write
res.end
- ...
隐式header模式(implicit header mode)?
即没有显示的调用writeHead
设置报文首部就开始发送数据的场景。Nodejs会有默认的生成报文首部的逻辑。
- 状态码取
res.statusCode
属性(默认200) - 状态描述取
res.statusMessage
属性,如果res.statusMessage
没有值则取STATUS_CODES
预定义的。 - 构建首部字段。
具体见ServerResponse.prototype._implicitHeader
实现(即内部也是调用writeHead
):
ServerResponse.prototype._implicitHeader = function _implicitHeader() {
this.writeHead(this.statusCode);
};