早上好!!我目前正在编写一个Node.js脚本,它正在联系一个弹性集群来获取一些数据。
剧本确实运行得很顺利。我在用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连接到其他网络并等待)(对我来说,它不会抛出任何超时错误或控制台中的任何错误)。
发布于 2017-09-18 16:58:35
对于HTTP请求,您的基础依赖于TCP。当您的Mac交换机与wifi网络相关联时,您正在断开已建立的TCP连接(没有终端通过RST数据包优雅地协商终止连接)。该建立的TCP连接然后进入空闲但keep_alive状态,在大多数Linux或Mac上,默认情况下,在这些空闲连接被剪除之前大约两个小时。
(您可以通过以下方法检查Mac的默认值( ms):
# 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模块来重新触发您的重试逻辑?
我建议你谷歌npm wifi,看看是否有任何建议的包是适合你的情况。
https://stackoverflow.com/questions/46265830
复制相似问题