NodeJs發(fā)起HTTP/HTTPS請(qǐng)求踩坑記

今天在做一個(gè)模擬登錄的功能,實(shí)現(xiàn)使用掃描二維碼的方式實(shí)現(xiàn)某Q的登錄。詳細(xì)過程省略,只說遇到坑與解決方案。
功能中使用的模塊如下:

  1. http
  2. https
  3. bluebird
  4. xml2js

在發(fā)生對(duì)HTTPS的POST請(qǐng)求時(shí),控制臺(tái)出現(xiàn): Error: socket hand up.錯(cuò)誤。

解決過程

1. 測(cè)試是否為相應(yīng)的api服務(wù)器出現(xiàn)問題

我使用瀏覽器打開相應(yīng)的api網(wǎng)址,瀏覽器中返回了正常的提示信息。說明api服務(wù)器沒問題。

2. 測(cè)試http/https模塊內(nèi)部機(jī)制出現(xiàn)問題

我把網(wǎng)址的修改為 快捎官網(wǎng) 。然后再運(yùn)行,發(fā)現(xiàn)請(qǐng)求正常返回了頁面文本,說明http/https模塊內(nèi)部機(jī)制可以正常使用。

為什么別的網(wǎng)址可以正常請(qǐng)求而某Q的api路徑卻請(qǐng)求不成功?是header頭設(shè)置有誤?還是我當(dāng)前請(qǐng)求的IP被拒絕請(qǐng)求?本著滿腦子的疑問,我繼續(xù)進(jìn)行了測(cè)試。

3. 完善請(qǐng)求信息,并使用其他開發(fā)語言進(jìn)行同樣的請(qǐng)求,以進(jìn)行結(jié)果對(duì)比

由于不敢確定所有的請(qǐng)求信息都是正確的,于是我使用java語言和python語言都做了一個(gè)副本,用來請(qǐng)求以進(jìn)行結(jié)果對(duì)照。最終發(fā)現(xiàn),所有請(qǐng)求數(shù)據(jù)都一致的情況下,java語言和python語言可以成功地返回正確結(jié)果,而Node.js卻報(bào)錯(cuò):Error: socket hand up

這時(shí)我心頭有千萬頭草泥馬在奔騰~~~@#$%%&*#@#$%
但程序員是不會(huì)這么容易就放棄的,何況遇到這個(gè)問題的那個(gè)還有強(qiáng)迫癥。我要克服你...

---- 繼續(xù)苦逼找尋答案中... ----

4. 轉(zhuǎn)機(jī)

詳細(xì)認(rèn)(zhuang)真(bi)地閱讀了NodeJs的 http.Agent 類的文檔,才晃(yi)然(lian)大(meng)誤(bi)。原來Node.js中,發(fā)起的HTTP請(qǐng)求,會(huì)被放入v8的網(wǎng)絡(luò)請(qǐng)求隊(duì)列中,而Agent則是負(fù)責(zé)管理HTTP客戶端的連接持久性和重用性。它為給定的主機(jī)和端口維護(hù)等待請(qǐng)求的隊(duì)列,為每個(gè)隊(duì)列重復(fù)使用一個(gè)單一的Socket連接,直接到隊(duì)列為空,此時(shí)Socket被銷毀或被重新放進(jìn)池中,在該池中保持對(duì)同一主機(jī)端口的請(qǐng)求再次使用。而這個(gè)Socket被銷毀還是保留,取決于keepAlive的配置。
所以這就是為什么我的程序會(huì)出現(xiàn)socket hand up錯(cuò)誤了,因?yàn)槲以陂_發(fā)模擬登錄功能時(shí),登錄成功后,有一個(gè)請(qǐng)求一直在輪詢檢查新消息。而另一方面,我會(huì)進(jìn)行其他的數(shù)據(jù)api請(qǐng)求,所以,當(dāng)輪詢的socket一直得不到釋放,那么其他的socket就一直處于等待(Pending)狀態(tài),當(dāng)超時(shí)時(shí)間到達(dá),就會(huì)報(bào)出Error: socket hand up錯(cuò)誤。

5. 解決方案

經(jīng)過以上探討,得出解決方案: 去除Socket代理,禁用請(qǐng)求隊(duì)列的重用,讓每次發(fā)起的請(qǐng)求都是新的Socket。

如下代碼:

http.post({
  hostname: 'localhost',
  port: 80,
  path: '/',
  agent: false    // 禁用agent
}, res => {
  // 對(duì)響應(yīng)數(shù)據(jù)進(jìn)行處理
})

一番努力,終于解決了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,292評(píng)論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,241評(píng)論 4 61
  • 我之前說過,放棄一部分安全感其實(shí)就像德?lián)?我是典型的緊松型.就像理智與感性的斗爭(zhēng).人活一世不能太過于理性,也不能太...
    我就是小賤賤閱讀 295評(píng)論 1 0
  • 月色寂寥空照影,人行凄風(fēng)吹酒醒。 十月初上茫茫意,此夜獨(dú)有踉蹌興。 濁酒未飲人已醉,乾坤倒轉(zhuǎn)倚南北。 人生縱有明日...
    式微_fe7e閱讀 259評(píng)論 0 1