如何在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

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

    process.on('uncaughtException', function (err) {

console.error(err.stack);

console.log("Node NOT Exiting...");

});

因此,我怀疑这不是Socket.io问题,而是对我执行的另一台服务器或MySQL /

Redis连接的HTTP请求。问题是错误堆栈无法帮助我识别代码问题。这是日志输出:

    Error: read ECONNRESET

at errnoException (net.js:900:11)

at TCP.onread (net.js:555:19)

我怎么知道是什么原因造成的?我如何从错误中得到更多?

好的,不是很冗长,但这是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] ] } }

在这里,我提供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)

这可能是原因吗?

回答:

我用于提供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)

以上是 如何在Node.js中调试错误ECONNRESET? 的全部内容, 来源链接: utcz.com/qa/420904.html

回到顶部