1. 程式人生 > >關於Can't set headers after they are sent.問題原理詳解

關於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頭,多次呼叫或者任何時候呼叫都不會報錯。這個應該不怎麼用得上。