使用NodeJS操作網(wǎng)絡(luò),特別是操作HTTP請(qǐng)求和響應(yīng)時(shí)會(huì)遇到一些驚喜,這里對(duì)一些常見問題做解答。
* 問: 為什么通過`headers`對(duì)象訪問到的HTTP請(qǐng)求頭或響應(yīng)頭字段不是駝峰的?
答: 從規(guī)范上講,HTTP請(qǐng)求頭和響應(yīng)頭字段都應(yīng)該是駝峰的。但現(xiàn)實(shí)是殘酷的,不是每個(gè)HTTP服務(wù)端或客戶端程序都嚴(yán)格遵循規(guī)范,所以NodeJS在處理從別的客戶端或服務(wù)端收到的頭字段時(shí),都統(tǒng)一地轉(zhuǎn)換為了小寫字母格式,以便開發(fā)者能使用統(tǒng)一的方式來訪問頭字段,例如`headers['content-length']`。
* 問: 為什么`http`模塊創(chuàng)建的HTTP服務(wù)器返回的響應(yīng)是`chunked`傳輸方式的?
答: 因?yàn)槟J(rèn)情況下,使用`.writeHead`方法寫入響應(yīng)頭后,允許使用`.write`方法寫入任意長(zhǎng)度的響應(yīng)體數(shù)據(jù),并使用`.end`方法結(jié)束一個(gè)響應(yīng)。由于響應(yīng)體數(shù)據(jù)長(zhǎng)度不確定,因此NodeJS自動(dòng)在響應(yīng)頭里添加了`Transfer-Encoding: chunked`字段,并采用`chunked`傳輸方式。但是當(dāng)響應(yīng)體數(shù)據(jù)長(zhǎng)度確定時(shí),可使用`.writeHead`方法在響應(yīng)頭里加上`Content-Length`字段,這樣做之后NodeJS就不會(huì)自動(dòng)添加`Transfer-Encoding`字段和使用`chunked`傳輸方式。
* 問: 為什么使用`http`模塊發(fā)起HTTP客戶端請(qǐng)求時(shí),有時(shí)候會(huì)發(fā)生`socket hang up`錯(cuò)誤?
答: 發(fā)起客戶端HTTP請(qǐng)求前需要先創(chuàng)建一個(gè)客戶端。`http`模塊提供了一個(gè)全局客戶端`http.globalAgent`,可以讓我們使用`.request`或`.get`方法時(shí)不用手動(dòng)創(chuàng)建客戶端。但是全局客戶端默認(rèn)只允許5個(gè)并發(fā)Socket連接,當(dāng)某一個(gè)時(shí)刻HTTP客戶端請(qǐng)求創(chuàng)建過多,超過這個(gè)數(shù)字時(shí),就會(huì)發(fā)生`socket hang up`錯(cuò)誤。解決方法也很簡(jiǎn)單,通過`http.globalAgent.maxSockets`屬性把這個(gè)數(shù)字改大些即可。另外,`https`模塊遇到這個(gè)問題時(shí)也一樣通過`https.globalAgent.maxSockets`屬性來處理。
- NodeJS基礎(chǔ)
- 什么是NodeJS
- 有啥用處
- 如何安裝
- 如何運(yùn)行
- 模塊
- 二進(jìn)制模塊
- 小結(jié)
- 代碼的組織和部署
- 模塊路徑解析規(guī)則
- 包(package)
- 命令行程序
- 工程目錄
- NPM
- 小結(jié)
- 文件操作
- 開門紅
- API走馬觀花
- 遍歷目錄
- 文本編碼
- 小結(jié)
- 網(wǎng)絡(luò)操作
- 開門紅
- API走馬觀花
- 靈機(jī)一點(diǎn)
- 小結(jié)
- 進(jìn)程管理
- 開門紅
- API走馬觀花
- 應(yīng)用場(chǎng)景
- 小結(jié)
- 異步編程
- 回調(diào)
- 代碼設(shè)計(jì)模式
- 域(Domain)
- 小結(jié)
- 大示例
- 需求
- 第一次迭代
- 第二次迭代
- 第三次迭代
- 第四次迭代
- 后續(xù)迭代
- 小結(jié)
