gpt4 book ai didi

javascript - 当有 OnGoing Request 时如何处理连接切换?

转载 作者:行者123 更新时间:2023-12-03 03:27:12 25 4
gpt4 key购买 nike

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

脚本确实运行顺利..我使用的是 Mac。

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

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

我正在使用请求模块和 Node 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 连接切换到其他网络并等待(对我来说,它不会在控制台中引发任何超时错误或任何类型的错误)。

最佳答案

您的 HTTP 请求对 TCP 有潜在的依赖性。当您的 Mac 切换与其关联的 wifi 网络时,您将中断已建立的 TCP 连接(两端不会通过 RST 数据包优雅地协商终止连接)。然后,已建立的 TCP 连接会进入空闲但 keep_alive 状态,在大多数 Linux 或 Mac 上,默认情况下,这种空闲连接会在大约 2 小时后被 trim 。

(您可以通过以下方式检查 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 模块来创建另一个事件来重新触发您的重试逻辑?

我建议您搜索 npm wifi 并查看建议的软件包是否适合您的情况。

关于javascript - 当有 OnGoing Request 时如何处理连接切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46265830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com