如果有OnGoing请求,如何处理连接切换?

时间:2017-09-17 15:36:48

标签: javascript node.js http elasticsearch

早上好! 我目前正在编写一个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连接到其他网络并等待(对我而言,它不会抛出任何超时错误或控制台中的任何错误)。

1 个答案:

答案 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并查看建议的任何套餐是否适合您的情况。