【问题标题】:Node https request ECONRESET after 5 minutes5分钟后节点https请求ECONRESET
【发布时间】:2017-11-27 20:33:05
【问题描述】:

我正在尝试向需要 5 分钟以上响应的服务器发出 https 请求。在任何数据通过套接字传输之前约 7 分钟,请求完成约 11 分钟。使用 Curl 时请求工作正常,但使用 node.js 发出请求时出现此错误:

Error:  { Error: read ECONNRESET
    at exports._errnoException (util.js:1026:11)
    at TLSWrap.onread (net.js:564:26) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }

用于发出请求的代码:

const https = require('https');

https.get({
    hostname: 'xxx',
    path: 'xxx',
    auth: 'xxx'
  },
  (res) => {
    res.on('data', (d) => {
      process.stdout.write(d);
    });
  }).on('error', (e) => {
  console.error(e);
});

由于请求在恰好 5 分钟(300 秒)后失败,我猜可能存在某种超时,但我似乎无法找出是哪一个或它在哪里。也可能是服务器端超时,但奇怪的是它与 Curl 一起工作。。

【问题讨论】:

  • 您是否尝试使用另一个模块,例如request 从另一个服务器获取数据?
  • 我还没有。会试一试,虽然我认为他们只是包装了 std https API.. 但我会试试看!
  • 不。使用 request.. 时出现同样的错误
  • 你是否通过请求设置了超时时间?
  • 您是否尝试过更改用户代理?可能目标服务器正在阻塞 Node.js 但不是 curl。

标签: node.js https


【解决方案1】:

解决方案是使用 TCP Keep-Alive。 https://nodejs.org/api/net.html#net_socket_setkeepalive_enable_initialdelay

req.on('socket', (s) => {
  s.setKeepAlive(true, 240000);
});

这将每 4 分钟在套接字上发送一个 TCP ACK 数据包,这足以解决我的问题。

【讨论】:

    【解决方案2】:

    来自Node js ECONNRESET

    “ECONNRESET”表示 TCP 会话的另一端突然关闭了它的连接端。

    来自What option causes curl to reconnect infinite times?

    每次请求的操作超时时,curl 都会尝试重新连接。

    具体如下:

    我的意思是使用 libcurl 作为第 3 方软件包

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多