鍍金池/ 問(wèn)答/HTML/ nodejs后臺(tái)中,用request.js post請(qǐng)求數(shù)據(jù),報(bào)錯(cuò)esocket

nodejs后臺(tái)中,用request.js post請(qǐng)求數(shù)據(jù),報(bào)錯(cuò)esockettimeout

clipboard.png
我請(qǐng)求的數(shù)據(jù)量上萬(wàn)條,于是,我分批請(qǐng)求,用await等待,每批500條,但是一直請(qǐng)求失敗,報(bào)錯(cuò)socket timeout,
stackoverflow: Node.js GET Request ETIMEDOUT & ESOCKETTIMEDOUT
github: Error: ESOCKETTIMEDOUT in request.js
找到解決方法,但是看不懂,求大神解救

回答
編輯回答
氕氘氚

關(guān)于這個(gè)問(wèn)題,request的github中有對(duì)這個(gè)問(wèn)題的討論:
request
除了你說(shuō)的那些方案之外,里面也有別人說(shuō)的解決方案:
request hander

2017年6月10日 23:47
編輯回答
爛人

首先你要知道錯(cuò)誤的原因,根據(jù)你給出的鏈接,上面說(shuō)這個(gè)錯(cuò)誤是因?yàn)閘ibuv底層只用4個(gè)線程,因此如果你有大量請(qǐng)求的時(shí)候很可能4線程個(gè)就忙不過(guò)來(lái)了,導(dǎo)致后續(xù)的請(qǐng)求只能排隊(duì)等待,當(dāng)網(wǎng)絡(luò)快的時(shí)候或許沒(méi)有問(wèn)題,但是網(wǎng)絡(luò)慢得時(shí)候很容易超時(shí)導(dǎo)致timeout,因此需要增加libuv的線程數(shù)??梢酝ㄟ^(guò)在程序中增加以下代碼來(lái)修改libuv的默認(rèn)線程數(shù)

process.env.UV_THREADPOOL_SIZE = 128;

同時(shí)你還需要注意記得開(kāi)啟http agent的keepalive屬性,因?yàn)槟J(rèn)情況下不開(kāi)啟,這會(huì)讓所有的http連接無(wú)法復(fù)用底層的socket,在我的項(xiàng)目里采用了這兩個(gè)方法之后確實(shí)大大減少了超時(shí)類型的錯(cuò)誤

2017年3月24日 15:35