首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当有OnGoing请求时,如何处理连接开关?

问当有OnGoing请求时,如何处理连接开关?
EN

Stack Overflow用户
提问于 2017-09-17 15:36:48
回答 1查看 118关注 0票数 0

早上好!!我目前正在编写一个Node.js脚本,它正在联系一个弹性集群来获取一些数据。

剧本确实运行得很顺利。我在用Mac。

现在我想到了一个场景,当我的脚本运行时,我的WiFi从一个连接切换到另一个连接,每当这种情况发生时,我的脚本就挂起。

如何在node.js中处理这些重新尝试特定请求的场景。

我正在使用请求模块和节点v6+。

每当我试图复制这个错误。我的脚本挂起很长时间,不会抛出任何错误。

P.S:我已经在重试“ETIMEDOUT”,“ECONNREFUSED”,“ENETUNREACH”

更新1:

代码语言:javascript
复制
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连接到其他网络并等待)(对我来说,它不会抛出任何超时错误或控制台中的任何错误)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-18 16:58:35

对于HTTP请求,您的基础依赖于TCP。当您的Mac交换机与wifi网络相关联时,您正在断开已建立的TCP连接(没有终端通过RST数据包优雅地协商终止连接)。该建立的TCP连接然后进入空闲但keep_alive状态,在大多数Linux或Mac上,默认情况下,在这些空闲连接被剪除之前大约两个小时。

(您可以通过以下方法检查Mac的默认值( ms):

代码语言:javascript
复制
# 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,看看是否有任何建议的包是适合你的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46265830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档