我正在运行一个使用Socket.io的Express.js应用程序,用于聊天Web应用程序,并且在24小时内随机出现大约5次以下错误。 Node处理过程被永久包装并立即重新启动。
问题是重新启动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...");
});
所以我怀疑这不是Socket.io的问题,而是我进行HTTP请求到另一个服务器或者MySQL/Redis连接时出现的问题。问题是错误堆栈并不能帮助我确定我的代码问题。这里是日志输出:
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)
这能是原因吗?