Ich führe eine Express.js-Anwendung mit Socket.io für eine Chat-Webanwendung aus und erhalte den folgenden Fehler ungefähr fünfmal während 24 Stunden zufällig. Der Knotenprozess ist für immer eingebunden und startet sich sofort neu.
Das Problem ist, dass ein Neustart von Express meine Benutzer aus ihren Räumen wirft und niemand das will.
Der Webserver wird von HAProxy vertreten. Es gibt keine Probleme mit der Socket-Stabilität, nur die Verwendung von Websockets und Flashsockets-Transporten. Ich kann das nicht absichtlich reproduzieren.
Dies ist der Fehler bei 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
BEARBEITEN (22.07.2013)
Sowohl der Socket.io-Client-Fehlerbehandler als auch der nicht erfasste Ausnahmebehandler wurden hinzugefügt. Scheint, dass dieser den Fehler fängt:
process.on('uncaughtException', function (err) {
console.error(err.stack);
console.log("Node NOT Exiting...");
});
Ich vermute also, dass es sich nicht um ein Socket.io-Problem handelt, sondern um eine HTTP-Anfrage an einen anderen Server oder eine MySQL / Redis-Verbindung. Das Problem ist, dass der Fehlerstapel mir nicht hilft, mein Codeproblem zu identifizieren. Hier ist die Protokollausgabe:
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
Woher weiß ich, was das verursacht? Wie kann ich mehr aus dem Fehler herausholen?
Ok, 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 diene ich der Flash-Socket-Richtliniendatei:
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)
Kann das die Ursache sein?