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?
Réponses:
Vous l'avez peut-être déjà deviné: c'est une erreur de connexion.
"ECONNRESET" signifie que l'autre côté de la conversation TCP a brusquement fermé son extrémité de la connexion. Cela est probablement dû à une ou plusieurs erreurs de protocole d'application. Vous pouvez consulter les journaux du serveur API pour voir s'il se plaint de quelque chose.
Mais comme vous cherchez également un moyen de vérifier l'erreur et éventuellement de déboguer le problème, vous devriez jeter un œil à " Comment déboguer une erreur de blocage de socket dans NodeJS? ", Qui a été publiée sur stackoverflow en relation avec une question similaire.
MODIFIER (2013-07-22)
Comme je l'ai écrit ci-dessus:
Ce qui pourrait également être le cas: à des moments aléatoires, l'autre côté est surchargé et tue simplement la connexion en conséquence. Si tel est le cas, cela dépend de ce à quoi vous vous connectez exactement…
Mais une chose est sûre: vous avez en effet une erreur de lecture sur votre connexion TCP qui provoque l'exception. Vous pouvez le voir en regardant le code d'erreur que vous avez publié dans votre modification, ce qui le confirme.
la source
Un simple serveur TCP que j'avais pour servir le fichier de politique flash était à l'origine de cela. Je peux maintenant attraper l'erreur en utilisant un gestionnaire:
la source
socket.destroy()
le gestionnaire d'erreurs pour m'assurer. Malheureusement, je ne trouve pas de documentation si elle est requise, mais elle n'émet pas d'erreur pour le faire.J'ai eu un problème similaire où les applications ont commencé à générer des erreurs après une mise à niveau de Node. Je crois que cela peut être retracé à la version Node v0.9.10 de cet article:
Les versions précédentes n'erraient pas sur les interruptions du client. Une interruption de la connexion du client génère l'erreur ECONNRESET dans le nœud. Je crois que c'est une fonctionnalité prévue pour Node, donc le correctif (au moins pour moi) était de gérer l'erreur, ce que je pense que vous avez fait dans des exceptions non capturées. Bien que je le gère dans le gestionnaire net.socket.
Vous pouvez le démontrer:
Créez un serveur de socket simple et obtenez Node v0.9.9 et v0.9.10.
Démarrez-le à l'aide de la v0.9.9, puis essayez de FTP sur ce serveur. J'utilise FTP et le port 21 uniquement parce que je suis sous Windows et que j'ai un client FTP, mais pas de client telnet à portée de main.
Du côté client, rompez simplement la connexion. (Je fais juste Ctrl-C)
Vous devriez voir PAS D'ERREUR lorsque vous utilisez Node v0.9.9 et ERREUR lorsque vous utilisez Node v.0.9.10 et plus.
En production, j'utilise la v.0.10. quelque chose et il donne toujours l'erreur. Encore une fois, je pense que cela est prévu et la solution consiste à gérer l'erreur dans votre code.
la source
Eu le même problème aujourd'hui. Après quelques recherches, j'ai trouvé une
--abort-on-uncaught-exception
option node.js très utile . Non seulement il fournit une trace de pile d'erreurs beaucoup plus verbeuse et utile, mais enregistre également le fichier principal en cas de plantage de l'application, ce qui permet un débogage supplémentaire.la source
J'étais confronté au même problème mais je l'ai atténué en plaçant:
avant
server.listen
.server
est un serveur HTTP ici. Le délai d'expiration par défaut est de 2 minutes selon la documentation de l' API .la source
Un autre cas possible (mais rare) pourrait être si vous avez des communications de serveur à serveur et que vous avez défini
server.maxConnections
une valeur très faible.Dans le noyau lib net.js du nœud, il appellera
clientHandle.close()
ce qui provoquera également l'erreur ECONNRESET:la source
maxConnections
valeur par défaut estInfinity
. Ce ne serait le cas (comme vous l'avez dit) que si vous avez explicitement outrepassé cette valeur.Oui, votre portion du fichier de stratégie peut définitivement provoquer le crash.
Pour répéter, ajoutez simplement un délai à votre code:
… Et utilisez
telnet
pour vous connecter au port. Si vous déconnectez telnet avant l'expiration du délai, vous obtiendrez un plantage (exception non interceptée) lorsque socket.write génère une erreur.Pour éviter le plantage ici, ajoutez simplement un gestionnaire d'erreur avant de lire / écrire le socket:
Lorsque vous essayez la déconnexion ci-dessus, vous obtenez simplement un message de journal au lieu d'un plantage.
Et lorsque vous avez terminé, n'oubliez pas de supprimer le retard.
la source
J'obtiens également une erreur ECONNRESET pendant mon développement, la façon dont je le résous est en n'utilisant pas nodemon pour démarrer mon serveur, il suffit de l'utiliser
"node server.js"
pour démarrer mon serveur a résolu mon problème.C'est bizarre, mais cela a fonctionné pour moi, maintenant je ne revois plus jamais l'erreur ECONNRESET.
la source
J'ai également eu cette erreur et j'ai pu la résoudre après des jours de débogage et d'analyse:
ma solution
Pour moi, VirtualBox (pour Docker) était le problème. J'ai eu la redirection de port configurée sur ma machine virtuelle et l'erreur ne s'est produite que sur le port redirigé.
conclusions générales
Les observations suivantes peuvent vous faire économiser des jours de travail que j'ai dû investir:
-> déterminez si quelque chose ne va pas avec votre réseau (paramètres), comme les VM, les pare-feu, etc., c'est probablement la cause du problème.
la source
J'ai résolu le problème simplement connectant à un autre réseau . C'est l'un des problèmes possibles.
Tel que discuté plus haut, ECONNRESET signifie que la conversation TCP a brusquement fermé son extrémité de la connexion.
Votre connexion Internet peut vous empêcher de vous connecter à certains serveurs. Dans mon cas, j'essayais de me connecter à mLab (service de base de données cloud qui héberge les bases de données MongoDB). Et mon FAI le bloque.
la source
J'avais résolu ce problème en:
npm update
dans le terminal pour mettre à jour npm.Après cela, j'ai essayé la même commande npm et la bonne chose est qu'elle a fonctionné. Je n'étais pas sûr que ce soit aussi simple que cela.
J'utilise CENTOS 7
la source
J'ai eu le même problème et il semble que la version Node.js était le problème.
J'ai installé la version précédente de Node.js (10.14.2) et tout allait bien en utilisant nvm (vous permet d'installer plusieurs versions de Node.js et de passer rapidement d'une version à une autre).
Ce n'est pas une solution «propre», mais elle peut vous servir temporairement.
la source
Je viens de comprendre cela, au moins dans mon cas d'utilisation.
J'obtenais
ECONNRESET
. Il s'est avéré que la façon dont mon client était configuré, il frappait le serveur avec un appel API une tonne de fois très rapidement - et il n'avait besoin de frapper le point de terminaison qu'une seule fois.Lorsque j'ai corrigé cela, l'erreur avait disparu.
la source
Essayez d'ajouter ces options à socket.io:
J'espère que cela t'aidera !
la source