[英]How to handle connection switch while there is a OnGoing Request?
早上好 !! 我目前正在編寫一個Node.js腳本,該腳本正在與彈性集群聯系以獲取一些數據。
好腳本確實運行順利..我正在使用Mac。
現在,我遇到了一種情況,當腳本運行時,WiFi會從一個連接切換到另一連接,無論何時發生這種情況,我的腳本都會掛起。
如何在node.js中處理這些情況以重試該特定請求。
我正在使用請求模塊和節點v6 +。
每當我嘗試重現此錯誤時。 我的腳本掛起了很長時間,沒有拋出任何錯誤。
PS:我已經在嘗試“ ETIMEDOUT”,“ ECONNREFUSED”,“ ENETUNREACH”
更新1:
const request = require('request');
const co = require('co');
function _makeRequest(options) {
return new Promise((resolve, reject) => {
request(options, function (error, response, body) {
if (error) return reject(error);
return resolve(body);
});
})
}
function makeRequest() {
let esOptions = {
method: 'GET',
url: `http://www.google.com`
};
return _makeRequest(esOptions);
}
co(function *() {
let result = yield makeRequest();
console.log(result);
}).catch(err => {
console.log(err);
})
要重現我面臨的問題,只需使用上面的腳本並使用wifi連接1。首先,不做任何調整,它將在控制台中打印html。 2.現在啟動腳本,一旦它開始將您的wifi連接切換到其他網絡並等待(對我而言,它不會引發任何超時錯誤或控制台中的任何錯誤)。
HTTP請求對TCP具有基礎依賴性。 當您的Mac切換與其關聯的wifi網絡時,您正在中斷已建立的TCP連接(沒有兩端通過RST數據包正常協商終止連接)。 然后,已建立的TCP連接將進入空閑但keep_alive狀態,在大多數Linux或Mac上,默認情況下,將在修剪此類空閑連接之前大約2小時。
(您可以通過以下方式檢查Mac的默認設置(以毫秒為單位):
# sysctl net.inet.tcp | grep keep
net.inet.tcp.keepidle: 7200000
net.inet.tcp.keepintvl: 75000
net.inet.tcp.keepinit: 75000
net.inet.tcp.keepcnt: 8
net.inet.tcp.always_keepalive: 0
)
因此,正如您所發現的那樣,您不會從已建立但空閑的TCP連接(從網絡層傳播)中自動收到中斷的大量通知; 您是否可以通過使用一些旨在管理基於wifi的網絡的npm模塊來創建另一個事件,以重新觸發重試邏輯?
我建議您使用google npm wifi
,看看是否有任何建議的軟件包適合您的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.