Estoy ejecutando una aplicación Express.js usando Socket.io para una aplicación web de chat y obtengo el siguiente error al azar alrededor de 5 veces durante 24 h. El proceso de nodo se envuelve para siempre y se reinicia de inmediato.
El problema es que reiniciar Express expulsa a mis usuarios de sus habitaciones y nadie quiere eso.
El servidor web está representado por HAProxy. No hay problemas de estabilidad de socket, solo se utilizan websockets y transportes flashsockets. No puedo reproducir esto a propósito.
Este es el error con 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
EDITAR (2013-07-22)
Se agregaron tanto el controlador de errores del cliente socket.io como el controlador de excepciones no capturados. Parece que este detecta el error:
process.on('uncaughtException', function (err) {
console.error(err.stack);
console.log("Node NOT Exiting...");
});
Entonces sospecho que no es un problema de Socket.io sino una solicitud HTTP a otro servidor que hago o una conexión MySQL / Redis. El problema es que la pila de errores no me ayuda a identificar mi problema de código. Aquí está la salida del registro:
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
¿Cómo sé qué causa esto? ¿Cómo obtengo más del error?
Ok, no muy detallado, pero aquí está el stacktrace con 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] ] } }
Aquí sirvo el archivo de política 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)
¿Puede ser esta la causa?
Respuestas:
Es posible que ya lo hayas adivinado: es un error de conexión.
"ECONNRESET" significa que el otro lado de la conversación TCP cerró abruptamente su final de la conexión. Esto probablemente se deba a uno o más errores de protocolo de aplicación. Puede mirar los registros del servidor API para ver si se queja de algo.
Pero dado que también está buscando una forma de verificar el error y potencialmente depurar el problema, debería echar un vistazo a " ¿Cómo depurar un error de bloqueo de socket en NodeJS? ", Que se publicó en stackoverflow en relación con una pregunta similar.
EDITAR (2013-07-22)
Como escribí arriba:
Lo que también podría ser el caso: en momentos aleatorios, el otro lado está sobrecargado y simplemente mata la conexión como resultado. Si ese es el caso, depende de a qué se esté conectando exactamente ...
Pero una cosa es segura: de hecho, tiene un error de lectura en su conexión TCP que causa la excepción. Puedes ver eso mirando el código de error que publicaste en tu edición, que lo confirma.
fuente
Un servidor tcp simple que tenía para servir el archivo de política flash estaba causando esto. Ahora puedo detectar el error usando un controlador:
fuente
socket.destroy()
al controlador de errores para asegurarme. Lamentablemente, no puedo encontrar documentación si es necesario, pero no emite un error al hacerlo.Tuve un problema similar en el que las aplicaciones comenzaron a fallar después de una actualización de Node. Creo que esto se remonta a la versión de nodo v0.9.10 de este artículo:
Las versiones anteriores no generarían errores en las interrupciones del cliente. Una interrupción en la conexión del cliente arroja el error ECONNRESET en el nodo. Creo que esta es la funcionalidad prevista para Node, por lo que la solución (al menos para mí) fue manejar el error, lo que creo que hizo en excepciones no detectadas. Aunque lo manejo en el controlador net.socket.
Puedes demostrar esto:
Cree un servidor de socket simple y obtenga Node v0.9.9 y v0.9.10.
Inícielo usando v0.9.9 y luego intente FTP a este servidor. Estoy usando FTP y el puerto 21 solo porque estoy en Windows y tengo un cliente FTP, pero no tengo un cliente Telnet a mano.
Luego, desde el lado del cliente, simplemente rompa la conexión. (Solo estoy haciendo Ctrl-C)
Debería ver NO ERROR cuando usa Node v0.9.9, y ERROR cuando usa Node v.0.9.10 y superior.
En producción, uso v.0.10. algo y todavía da el error. Nuevamente, creo que esto está destinado y la solución es manejar el error en su código.
fuente
Tuve el mismo problema hoy. Después de algunas investigaciones he encontrado una muy útil
--abort-on-uncaught-exception
opción de Node.js . No solo proporciona un seguimiento de la pila de errores mucho más detallado y útil, sino que también guarda el archivo principal en caso de bloqueo de la aplicación, lo que permite una mayor depuración.fuente
Estaba enfrentando el mismo problema pero lo mitigé colocando:
antes
server.listen
.server
es un servidor HTTP aquí. El tiempo de espera predeterminado es de 2 minutos según la documentación de la API .fuente
Otro caso posible (pero raro) podría ser si tiene comunicaciones de servidor a servidor y ha establecido
server.maxConnections
un valor muy bajo.En el nodo del núcleo lib net.js llamará,
clientHandle.close()
lo que también causará el error ECONNRESET:fuente
maxConnections
el valor predeterminado esInfinity
. Este sería solo el caso (como usted dijo) si ha anulado explícitamente ese valor.Sí, su publicación del archivo de políticas definitivamente puede causar el bloqueo.
Para repetir, solo agregue un retraso a su código:
... y usar
telnet
para conectarse al puerto. Si desconecta telnet antes de que la demora haya expirado, obtendrá un bloqueo (excepción no detectada) cuando socket.write arroje un error.Para evitar el bloqueo aquí, solo agregue un controlador de errores antes de leer / escribir el socket:
Cuando intente la desconexión anterior, solo recibirá un mensaje de registro en lugar de un bloqueo.
Y cuando haya terminado, recuerde eliminar el retraso.
fuente
También recibo un error ECONNRESET durante mi desarrollo, la forma en que lo soluciono es al no usar nodemon para iniciar mi servidor, solo usar
"node server.js"
para iniciar mi servidor solucionó mi problema.Es extraño, pero funcionó para mí, ahora nunca veo el error ECONNRESET nuevamente.
fuente
También tuve este error y pude resolverlo después de días de depuración y análisis:
mi solución
Para mí VirtualBox (para Docker) fue el problema. Tenía el reenvío de puertos configurado en mi VM y el error solo ocurrió en el puerto reenviado.
conclusiones generales
Las siguientes observaciones pueden ahorrarle días de trabajo que tuve que invertir:
-> descubra si algo está jugando con su red (configuraciones), como máquinas virtuales, firewalls, etc., esta es probablemente la causa del problema.
fuente
Resolví el problema simplemente conectándome a una red diferente . Ese es uno de los posibles problemas.
Como se discutió anteriormente, ECONNRESET significa que la conversación TCP cerró abruptamente su final de la conexión.
Es posible que su conexión a Internet le impida conectarse a algunos servidores. En mi caso, intentaba conectarme a mLab (servicio de base de datos en la nube que aloja las bases de datos MongoDB). Y mi ISP lo está bloqueando.
fuente
Había resuelto este problema:
npm update
Escribí : en la terminal para actualizar npm.Después de eso probé el mismo comando npm y lo bueno fue que funcionó. No estaba seguro de que sea así de simple.
Estoy usando CENTOS 7
fuente
Tuve el mismo problema y parece que la versión Node.js fue el problema.
Instalé la versión anterior de Node.js (10.14.2) y todo estaba bien usando nvm (le permite instalar varias versiones de Node.js y cambiar rápidamente de una versión a otra).
No es una solución "limpia", pero puede servirle temporalmente.
fuente
Acabo de descubrir esto, al menos en mi caso de uso.
Me estaba poniendo
ECONNRESET
. Resultó que la forma en que estaba configurado mi cliente, estaba golpeando al servidor con una llamada API una tonelada de veces realmente rápido, y solo necesitaba llegar al punto final una vez.Cuando arreglé eso, el error desapareció.
fuente
Intente agregar estas opciones a socket.io:
Espero que esto ayude !
fuente