关于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头,多次调用或者任何时候调用都不会报错。这个应该不怎么用得上。

猜你喜欢

转载自blog.csdn.net/weixin_43564237/article/details/83658645