如何在Node.js中调试错误ECONNRESET?

我正在使用Socket.io运行Express.js应用程序用于聊天Web应用程序,并且在24小时内大约5次随机收到以下错误。节点进程将被永久封装,并立即重新启动。

问题是重新启动Express将我的用户踢出他们的房间,没人希望这样做。

Web服务器由HAProxy代理。仅使用websockets和flashsockets传输就没有套接字稳定性问题。我无法有意复制此内容。

这是Node的错误v0.10.11

    events.js:72
            throw er; // Unhandled 'error' event
                  ^
    Error: read ECONNRESET     //alternatively it s a 'write'
        at errnoException (net.js:900:11)
        at TCP.onread (net.js:555:19)
    error: Forever detected script exited with code: 8
    error: Forever restarting script for 2 time

编辑(2013-07-22)

添加了socket.io客户端错误处理程序和未捕获的异常处理程序。似乎此错误捕获了:

    process.on('uncaughtException', function (err) {
      console.error(err.stack);
      console.log("Node NOT Exiting...");
    });

So I suspect it's not a Socket.io issue but an HTTP request to another server that I do or a MySQL/Redis connection. The problem is that the error stack doesn't help me identify my code issue. Here is the log output:

    Error: read ECONNRESET
        at errnoException (net.js:900:11)
        at TCP.onread (net.js:555:19)

How do I know what causes this? How do I get more out of the error?

Ok, not very verbose but here's the stacktrace with Longjohn:

    Exception caught: Error ECONNRESET
    { [Error: read ECONNRESET]
      code: 'ECONNRESET',
      errno: 'ECONNRESET',
      syscall: 'read',
      __cached_trace__:
       [ { receiver: [Object],
           fun: [Function: errnoException],
           pos: 22930 },
         { receiver: [Object], fun: [Function: onread], pos: 14545 },
         {},
         { receiver: [Object],
           fun: [Function: fireErrorCallbacks],
           pos: 11672 },
         { receiver: [Object], fun: [Function], pos: 12329 },
         { receiver: [Object], fun: [Function: onread], pos: 14536 } ],
      __previous__:
       { [Error]
         id: 1061835,
         location: 'fireErrorCallbacks (net.js:439)',
         __location__: 'process.nextTick',
         __previous__: null,
         __trace_count__: 1,
         __cached_trace__: [ [Object], [Object], [Object] ] } }

Here I serve the flash socket policy file:

    net = require("net")
    net.createServer( (socket) =>
      socket.write("<?xml version=\"1.0\"?>\n")
      socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n")
      socket.write("<cross-domain-policy>\n")
      socket.write("<allow-access-from domain=\"*\" to-ports=\"*\"/>\n")
      socket.write("</cross-domain-policy>\n")
      socket.end()
    ).listen(843)

Can this be the cause?

飞云A小宇宙2020/03/19 12:32:40

我遇到了同样的问题,看来Node.js版本就是问题所在。

我安装了以前版本的Node.js(10.14.2),使用nvm一切正常(允许您安装Node.js的多个版本,并迅速从一个版本切换到另一个版本)。

这不是一个“干净”的解决方案,但可以为您提供临时服务。

EvaDavaid2020/03/19 12:32:40

我只需连接到另一个网络就解决了这个问题那是可能的问题之一。

如上所述,ECONNRESET表示TCP会话突然关闭了其连接的末端。

您的互联网连接可能会阻止您连接到某些服务器。就我而言,我试图连接到mLab(托管MongoDB数据库的云数据库服务)。而且我的ISP阻止了它。

ProDavaid2020/03/19 12:32:40

我已经通过以下方法解决了这个问题:

  • 关闭我的wifi /以太网连接,然后再打开。
  • npm update在终端输入:更新npm。
  • 我尝试从会话中注销并再次登录

在那之后,我尝试了相同的npm命令,好在它解决了。我不确定是否那么简单。

我正在使用CENTOS 7

A番长2020/03/19 12:32:40

我也遇到了这个错误,经过几天的调试和分析,我能够解决它:

我的解决方案

对我来说,VirtualBox(对于Docker)是个问题。我在VM上配置了端口转发,并且该错误仅在转发的端口上发生。

一般结论

以下观察结果可能会节省您不得不投资的工作时间:

  • 对我来说,问题仅发生在一个端口上从本地主机到本地主机的连接上。->检查更改任何这些常数即可解决问题。
  • 对我来说,问题仅发生在我的机器上->让其他人尝试一下。
  • 对我来说,该问题仅在一段时间后发生,无法可靠地重现
  • 我的问题无法用任何节点或表达(调试)工具进行检查。->不要在此浪费时间

->弄清您的网络(设置)是否混乱,例如VM,防火墙等,这可能是问题的原因。

米亚L2020/03/19 12:32:40

我在开发过程中也遇到ECONNRESET错误,解决问题的方法是使用nodemon来启动服务器,而只是使用"node server.js"启动服务器来解决问题。

很奇怪,但是对我有用,现在我再也看不到ECONNRESET错误。

番长小胖2020/03/19 12:32:40

今天遇到了同样的问题。经过研究,我发现了一个非常有用的--abort-on-uncaught-exceptionnode.js选项它不仅提供了更多详细和有用的错误堆栈跟踪,而且还保存了应用程序崩溃时的核心文件,允许进一步调试。

Sam小哥逆天2020/03/19 12:32:40

我用于提供Flash策略文件的一个简单的TCP服务器导致了此问题。我现在可以使用处理程序来捕获错误:

# serving the flash policy file
net = require("net")

net.createServer((socket) =>
  //just added
  socket.on("error", (err) =>
    console.log("Caught flash policy server socket error: ")
    console.log(err.stack)
  )

  socket.write("<?xml version=\"1.0\"?>\n")
  socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n")
  socket.write("<cross-domain-policy>\n")
  socket.write("<allow-access-from domain=\"*\" to-ports=\"*\"/>\n")
  socket.write("</cross-domain-policy>\n")
  socket.end()
).listen(843)
TomGO2020/03/19 12:32:40

另一种可能的情况(但很少见)可能是您具有服务器到服务器的通信并且设置server.maxConnections为非常低的值。

在节点的核心库net.js中,它将调用clientHandle.close(),这也会导致错误ECONNRESET:

if (self.maxConnections && self._connections >= self.maxConnections) {
  clientHandle.close(); // causes ECONNRESET on the other end
  return;
}
神奇Tony古一2020/03/19 12:32:40

我遇到了同样的问题,但通过放置以下内容缓解了它:

server.timeout = 0;

之前server.listenserver是这里的HTTP服务器。根据API文档,默认超时为2分钟