我正在使用Socket运行一个Express.js应用程序。IO的聊天网络应用程序 我在24小时内随机得到了5次以下错误。 节点进程永远被包装起来,并立即重新启动自己。

问题是重新启动Express会把我的用户赶出他们的房间 没有人希望这样。

web服务器通过HAProxy代理。插座不存在稳定性问题, 只是使用websockets和flashsockets传输。 我不能故意复制这个。

这是节点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...");
    });

所以我怀疑这不是插座。发送HTTP请求到另一个服务器 或者MySQL/Redis连接。问题在于错误堆栈 不能帮我找出我的代码问题。以下是日志输出:

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

我怎么知道是什么引起的呢?我如何从错误中得到更多?

好吧,不是很啰嗦,但这里是与朗约翰的堆栈跟踪:

    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] ] } }

这里我提供了flash套接字策略文件:

    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)

这是原因吗?


当前回答

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

关闭我的wifi/以太网连接并打开。 我在终端输入:npm update来更新npm。 我试图退出会话并重新登录

之后,我尝试了相同的npm命令,好的事情是它成功了。我不确定是不是那么简单。

我用的是CENTOS 7

其他回答

我刚刚算出来了,至少在我的用例中。

我得到了ECONNRESET。事实证明,我的客户端设置的方式是,它用API调用大量地快速地访问服务器,而它只需要访问端点一次。

当我修复它时,错误就消失了。

Node JS套接字不阻塞io。考虑使用来自其他源的非阻塞io连接。例如,如果使用带有node的阻塞Java套接字,它只会工作几秒钟,之后就会出现错误。通过实现一个非阻塞的连接来缓解这个问题,例如带有选择器的socketchannel。

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

我的解决方案

对我来说,VirtualBox(用于Docker)是一个问题。我在我的虚拟机上配置了端口转发,错误只发生在转发的端口上。

一般的结论

以下观察可以帮你节省我不得不投入的工作时间:

对我来说,这个问题只发生在一个端口上从本地主机到本地主机的连接上。->检查改变任何这些常数解决问题。 对我来说,问题只发生在我的机器->让别人试试。 对我来说,这个问题只发生在一段时间后,无法可靠地再现 无法使用任何节点或表达式(调试)工具检查“我的问题”。-别在这上面浪费时间了

找出是否有什么东西在你的网络(-settings),如虚拟机,防火墙等,这可能是问题的原因。

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

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

if (self.maxConnections && self._connections >= self.maxConnections) {
  clientHandle.close(); // causes ECONNRESET on the other end
  return;
}

我也有同样的问题,似乎是Node.js版本的问题。

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

这不是一个“干净”的解决方案,但它可以暂时为你服务。