为何Node.js中res.write后调用res.send会触发ERR_HTTP_HEADERS_SENT错误?
为什么Express里先res.write再res.send会触发头已发送错误?
你之前的理解有误:res.write会触发响应头的发送。HTTP协议规定,响应必须先发送状态行和响应头,才能传输响应体内容。当你第一次调用res.write时,Express会自动帮你发送默认的响应头(比如200状态码、默认的Content-Type),因为要先把头发出去,才能开始传响应体的内容。
再看res.send的工作逻辑:res.send会自动处理三件事——如果响应头还没发送,就先设置必要的头(比如根据内容自动设置Content-Type、计算Content-Length);然后写入响应体;最后调用res.end结束响应。但如果之前已经通过res.write发送过头了,res.send再尝试去设置或修改头,就会触发错误,毕竟头一旦发出去就没法再更改了。
举个实际流程例子:
- 调用
res.write('hello'):Express自动发送200状态码、默认Content-Type等响应头,然后把'hello'作为响应体的一部分发给客户端。 - 接着调用
res.send('world'):res.send发现头已经发过了,但还是会尝试去设置Content-Length等头,这时候就会抛出Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client错误。
- 调用
正确的做法:如果已经用了res.write,就用res.end来结束响应,不要用res.send。比如:
res.write('hello'); res.end('world'); // 这样不会报错,res.end只是追加响应体并结束请求,不会再尝试修改头或者全程只用res.send,不要混合两种写法。
内容的提问来源于stack exchange,提问作者Jean François Manatane
相关产品推荐
相关产品推荐

