【发布时间】:2013-06-19 05:06:41
【问题描述】:
我正在运行一个使用 Socket.io 的 Express.js 应用程序,用于聊天网络应用程序 我在 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...");
});
所以我怀疑这不是 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] ] } }
这里我提供闪存套接字策略文件:
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)
这可能是原因吗?
【问题讨论】:
-
@GottZ 也许这可以帮助(与在节点 js 中工作的人交谈)gist.github.com/samsonradu/1b0c6feb438f5a53e30e。我今天将部署 socket.error 处理程序并通知您。
-
@Gottz socket.error 句柄没有帮助,但 process.on('uncaughtException') 捕获了错误。这是错误的console.log:{ [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
-
ECONNRESET 可能来自网络问题。如您所知,在测试时不可能捕获所有异常。有些会出现在您的生产服务器上。您将不得不使您的服务器健壮。您可以使用 Redis 作为存储来处理会话删除。即使您的节点服务器出现故障,它也会使您的会话持续存在。
-
为什么这与会话删除有关?无论如何,它们都由 Redis 处理。
-
您至少有一个未设置处理程序的 TCP 套接字侦听。所以现在是时候检查那个在哪里了:D
标签: node.js sockets tcp express