Ich betreibe eine Express.js-Anwendung, die Socket.io für eine Chat-Webanwendung verwendet, und ich erhalte den folgenden Fehler sporadisch etwa 5 Mal innerhalb von 24 Stunden. Der Node-Prozess ist in forever eingebunden und startet sich sofort neu.
Das Problem ist, dass das Neustarten von Express meine Benutzer aus ihren Räumen wirft und das möchte niemand.
Der Webserver wird von HAProxy proxied. Es gibt keine Probleme mit der Socket-Stabilität, es werden nur Websockets und Flashsockets-Transports verwendet. Ich kann diesen Fehler nicht absichtlich reproduzieren.
Das ist der Fehler mit 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
EDIT (2013-07-22)
Habe sowohl den Fehlerhandler für den socket.io-Client als auch den unerfassten Ausnahme-Handler hinzugefügt. Es scheint, dass dieser den Fehler erfasst:
process.on('uncaughtException', function (err) {
console.error(err.stack);
console.log("Node NICHT beenden...");
});
Ich vermute also, dass es kein Socket.io-Problem ist, sondern eine HTTP-Anfrage an einen anderen Server, die ich mache, oder eine MySQL/Redis-Verbindung. Das Problem ist, dass der Fehler-Stack mir nicht hilft, meinen Codefehler zu identifizieren. Hier ist die Protokollausgabe:
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
Wie kann ich herausfinden, was das verursacht? Wie bekomme ich mehr Informationen aus dem Fehler?
Okay, nicht sehr ausführlich, aber hier ist der Stacktrace mit 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] ] } }
Hier bediene ich die Flash-Socket-Richtliniendatei:
net = require("net")
net.createServer( (socket) =>
socket.write("\n")
socket.write("\n")
socket.write("\n")
socket.write("\n")
socket.write("\n")
socket.end()
).listen(843)
Kann das die Ursache sein?