J'exécute une application Express.js en utilisant Socket.io pour une webapp de chat et j'obtiens l'erreur suivante au hasard environ 5 fois pendant 24h. Le processus de nœud est enveloppé pour toujours et il redémarre immédiatement.
Le problème est que le redémarrage d'Express expulse mes utilisateurs de leurs chambres et personne ne veut ça.
Le serveur Web est mandaté par HAProxy. Il n'y a pas de problèmes de stabilité de socket, il suffit d'utiliser les transports websockets et flashsockets. Je ne peux pas reproduire cela exprès.
C'est l'erreur avec 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
MODIFIER (2013-07-22)
Ajout du gestionnaire d'erreurs du client socket.io et du gestionnaire d'exceptions non capturé. Semble que celui-ci capture l'erreur:
process.on('uncaughtException', function (err) {
console.error(err.stack);
console.log("Node NOT Exiting...");
});
Je soupçonne donc que ce n'est pas un problème Socket.io mais une requête HTTP vers un autre serveur que je fais ou une connexion MySQL / Redis. Le problème est que la pile d'erreurs ne m'aide pas à identifier mon problème de code. Voici la sortie du journal:
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
Comment savoir ce qui cause cela? Comment tirer le meilleur parti de l'erreur?
Ok, pas très verbeux mais voici le stacktrace avec 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] ] } }
Ici, je sers le fichier de politique de socket 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)
Cela peut-il être la cause?