【问题标题】:Node.js HTTP GET “ECONNRESET” Error on readNode.js HTTP GET “ECONNRESET” 读取错误
【发布时间】:2018-03-21 19:43:31
【问题描述】:

我已阅读 SO 和 GitHub 上有关此错误的所有相关问题,但似乎都没有解决这种情况。

当我运行以下代码时:

response = await axios.get('http://localhost:8082/panda, {
  httpAgent: new http.Agent({ keepAlive: true, keepAliveMsecs: 10000 })
});

我收到以下错误:

{ Error: socket hang up
    at createHangUpError (_http_client.js:345:15)
    at Socket.socketOnEnd (_http_client.js:437:23)
    at emitNone (events.js:110:20)
    at Socket.emit (events.js:207:7)
    at endReadableNT (_stream_readable.js:1059:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9) code: 'ECONNRESET' }
{ Error: read ECONNRESET
    at _errnoException (util.js:1019:11)
    at TCP.onread (net.js:608:25)
  code: 'ECONNRESET',
  errno: 'ECONNRESET',
  syscall: 'read',
  etc...

除了onread 调用之外没有堆栈跟踪,因此不清楚如何获取传递给 net.js 中 onread 方法的 ECONNRESET 错误代码 (-54) 之外的任何其他信息

每个请求都会出现此问题 - 它不是间歇性的。

一些观察:

  • 从 chrome 或 postman 发出相同请求时,请求不会失败
  • 尝试使用相同的标头重现来自 Chrome 的成功请求失败
  • 将接受标头设置为使用“gzip”等没有帮助 - 我已经尝试了所有建议,包括一些奇怪的建议,例如设置内容长度和向请求添加正文,尽管这是一个 GET 请求
    • 错误总是出现在 net.js 中,但同时出现在 request 和 axios 库中

这是有趣的部分 - 我似乎只能在本地托管服务器时可靠地重现此问题。我可以通过 docker 容器访问开发实例或在 vagrant 中运行服务器,没有问题。

如果这有什么不同,我正在运行 macOS Sierra 10.12.6。服务器是用 Java 编写的,并使用 Spring 框架。这是我用于 HTTP 调用的 RestTemplate 配置:

@Bean
public RestTemplate restTemplate() {
    //request timeout
    int timeout = 5000;

    //Connection Pooling factory with timeouts to prevent disastrous request responses
    HttpComponentsClientHttpRequestFactory cf = new HttpComponentsClientHttpRequestFactory();
    cf.setReadTimeout(timeout);
    cf.setConnectTimeout(timeout);
    cf.setConnectionRequestTimeout(timeout);

    return new RestTemplate(cf);
}

我试过乱搞这些设置,但没有成功。

有什么想法吗?

【问题讨论】:

  • “连接重置”错误可能表明服务器进程遇到问题(例如,它崩溃了)。您是否查看过您尝试调用的任何服务器进程的日志?
  • 我在本地调试进程时对此进行了测试 - 没有崩溃,日志中也没有任何内容......我尝试添加一个拦截器来记录错误并更改我的 application.properties 文件中的各种日志记录级别 - 它请求似乎从未到达服务器
  • 你用的是什么版本的节点等...
  • @Corvusoft 抱歉,我以为我把它包含在了 for - 我已经能够使用最新版本的节点 7 和 8 进行复制
  • 请在一个终端运行socat -v TCP4-LISTEN:8081 TCP:127.0.0.1:8082,这将显示所有流量,然后在你的NodeJS代码中使用http://localhost:8081/panda,看看你是否发现了什么有趣的东西

标签: javascript java node.js spring axios


【解决方案1】:

我也有同样的问题。原因在于我的代理设置。我将代理端口 localhost:8080 设置为我的 localhost:3000。这就是为什么从我的 NodeJS 应用程序到 localhost:3000 的所有 API 请求都返回“ECONNRESET”错误的原因。当我删除代理端口时,问题已解决。检查您的网络设置。可能是重定向问题

【讨论】:

    【解决方案2】:

    这是 NodeJS 的一个已知问题,现已解决。详情请见http.Agent: idle sockets throw unhandled ECONNRESET

    同时确保您在 MacOS 上opening a port 时启用了正确的安全设置

    【讨论】:

    • 我看到了这个问题,但如果这个问题在一年前得到修复,我认为它会出现在节点 7 和 8 的最新版本中
    • 此问题在防火墙未开启的情况下发生
    • 出于好奇,当您在 root 下运行应用程序时会发生什么?
    • 没什么区别
    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 2014-01-24
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多