使用NodeJS操作網絡,特別是操作HTTP請求和響應時會遇到一些驚喜,這里對一些常見問題做解答。
問: 為什么通過headers
對象訪問到的HTTP請求頭或響應頭字段不是駝峰的?
答: 從規(guī)范上講,HTTP請求頭和響應頭字段都應該是駝峰的。但現(xiàn)實是殘酷的,不是每個HTTP服務端或客戶端程序都嚴格遵循規(guī)范,所以NodeJS在處理從別的客戶端或服務端收到的頭字段時,都統(tǒng)一地轉換為了小寫字母格式,以便開發(fā)者能使用統(tǒng)一的方式來訪問頭字段,例如headers['content-length']
。
問: 為什么http
模塊創(chuàng)建的HTTP服務器返回的響應是chunked
傳輸方式的?
答: 因為默認情況下,使用.writeHead
方法寫入響應頭后,允許使用.write
方法寫入任意長度的響應體數(shù)據,并使用.end
方法結束一個響應。由于響應體數(shù)據長度不確定,因此NodeJS自動在響應頭里添加了Transfer-Encoding: chunked
字段,并采用chunked
傳輸方式。但是當響應體數(shù)據長度確定時,可使用.writeHead
方法在響應頭里加上Content-Length
字段,這樣做之后NodeJS就不會自動添加Transfer-Encoding
字段和使用chunked
傳輸方式。
問: 為什么使用http
模塊發(fā)起HTTP客戶端請求時,有時候會發(fā)生socket hang up
錯誤?
答: 發(fā)起客戶端HTTP請求前需要先創(chuàng)建一個客戶端。http
模塊提供了一個全局客戶端http.globalAgent
,可以讓我們使用.request
或.get
方法時不用手動創(chuàng)建客戶端。但是全局客戶端默認只允許5個并發(fā)Socket連接,當某一個時刻HTTP客戶端請求創(chuàng)建過多,超過這個數(shù)字時,就會發(fā)生socket hang up
錯誤。解決方法也很簡單,通過http.globalAgent.maxSockets
屬性把這個數(shù)字改大些即可。另外,https
模塊遇到這個問題時也一樣通過https.globalAgent.maxSockets
屬性來處理。
更多建議: