关于Can't set headers after they are sent.问题原理详解

关于Can't set headers after they are sent.问题原理详解

问题:

之前在使用express的时候时而遇到Can't set headers after they are sent.错误;

网上搜到很多解决办法但是都没有文章介绍其中深层次的原理,直到我去node官方文档看到http模块的api,才弄清楚原因。
响应部分的write api
注意到图中倒数第二段,当 首次调用responce.write() 就会发送响应头和响应主体的第一块数据到客户端。
而设置响应头有两个方法,一个是setHeader,一个是writeHead:
响应部分的setHeader api
响应部分的writeHead api
但是注意!其实在write()或end()之后使用writeHead()设置http头时,是不会报错的,(这个我试过了),真正会报错的是responce.setHeader()函数!
而express的中间件很多都是对setHeader的封装,因为writeHead只能对http头一次性设置。

解决办法:

了解第一个概念之后,就明白问题出在哪了。
只要处理流程按照这样严格的顺序,就不会报这个错误了:

1、检查整个处理流程,所有对http头的设置(setHeader)必须在发送一段主体数据之前调用,否则会报错,并且在最后一定要用end()结束处理流程。
2、用底层的writeHeader方法也可以一次性设置http头,多次调用或者任何时候调用都不会报错。这个应该不怎么用得上。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值