W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
使用 NodeJS 操作網(wǎng)絡(luò),特別是操作 HTTP 請求和響應(yīng)時會遇到一些驚喜,這里對一些常見問題做解答。
問: 為什么通過 headers 對象訪問到的 HTTP 請求頭或響應(yīng)頭字段不是駝峰的?
答: 從規(guī)范上講,HTTP 請求頭和響應(yīng)頭字段都應(yīng)該是駝峰的。但現(xiàn)實是殘酷的,不是每個 HTTP 服務(wù)端或客戶端程序都嚴(yán)格遵循規(guī)范,所以 NodeJS 在處理從別的客戶端或服務(wù)端收到的頭字段時,都統(tǒng)一地轉(zhuǎn)換為了小寫字母格式,以便開發(fā)者能使用統(tǒng)一的方式來訪問頭字段,例如 headers['content-length']。
問: 為什么 http 模塊創(chuàng)建的 HTTP 服務(wù)器返回的響應(yīng)是 chunked 傳輸方式的?
答: 因為默認(rèn)情況下,使用.writeHead
方法寫入響應(yīng)頭后,允許使用.write
方法寫入任意長度的響應(yīng)體數(shù)據(jù),并使用.end
方法結(jié)束一個響應(yīng)。由于響應(yīng)體數(shù)據(jù)長度不確定,因此 NodeJS 自動在響應(yīng)頭里添加了 Transfer-Encoding: chunked 字段,并采用 chunked 傳輸方式。但是當(dāng)響應(yīng)體數(shù)據(jù)長度確定時,可使用.writeHead
方法在響應(yīng)頭里加上 Content-Length 字段,這樣做之后 NodeJS 就不會自動添加 Transfer-Encoding 字段和使用 chunked 傳輸方式。
問: 為什么使用 http 模塊發(fā)起 HTTP 客戶端請求時,有時候會發(fā)生 socket hang up 錯誤?
答: 發(fā)起客戶端 HTTP 請求前需要先創(chuàng)建一個客戶端。http 模塊提供了一個全局客戶端 http.globalAgent,可以讓我們使用.request
或.get
方法時不用手動創(chuàng)建客戶端。但是全局客戶端默認(rèn)只允許 5 個并發(fā) Socket 連接,當(dāng)某一個時刻 HTTP 客戶端請求創(chuàng)建過多,超過這個數(shù)字時,就會發(fā)生 socket hang up 錯誤。解決方法也很簡單,通過 http.globalAgent.maxSockets 屬性把這個數(shù)字改大些即可。另外,https 模塊遇到這個問題時也一樣通過 https.globalAgent.maxSockets 屬性來處理。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: