脚本运行顺利..我正在使用Mac。
现在我遇到了一个场景,当我的脚本运行时,我的WiFi正从一个连接切换到另一个连接,只要发生这种情况,我的脚本就会挂起。
如何在node.js中处理这些方案以重试该特定请求。
我正在使用请求模块和节点v6 +。
每当我尝试重现此错误时。我的脚本长时间挂起,不会丢失任何错误。
P.S:我已经在为“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连接到其他网络并等待(对我而言,它不会抛出任何超时错误或控制台中的任何错误)。
答案 0 :(得分:1)
您的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
并查看建议的任何套餐是否适合您的情况。