Solución:
Puede 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 extremo de la conexión. Lo más probable es que esto 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 colgar el socket en NodeJS?” que se publicó en stackoverflow en relación con una pregunta similar.
Solución rápida y sucia para el desarrollo:
Use longjohn, obtendrá rastros de pila largos que contendrán las operaciones asíncronas.
Solución limpia y correcta: Técnicamente, en el nodo, siempre que emita un
'error'
evento y nadie lo escucha, arrojará. Para que no se lance, ponle un oyente y manéjalo tú mismo. De esa forma, puede registrar el error con más información.Para tener un oyente para un grupo de llamadas, puede usar dominios y también detectar otros errores en tiempo de ejecución. Asegúrese de que cada operación asíncrona relacionada con http (servidor / cliente) esté en un contexto de dominio diferente en comparación con las otras partes del código, el dominio escuchará automáticamente el
error
eventos y lo propagará a su propio controlador. Entonces, solo escucha ese controlador y obtiene los datos de error. También obtienes más información de forma gratuita.
EDITAR (2013-07-22)
Como escribí arriba:
“ECONNRESET” significa que el otro lado de la conversación TCP cerró abruptamente su extremo de la conexión. Lo más probable es que esto 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.
Lo que también podría ser el caso: en momentos aleatorios, el otro lado está sobrecargado y, como resultado, simplemente mata la conexión. 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. Puede verlo mirando el código de error que publicó en su edición, que lo confirma.
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:
# serving the flash policy file
net = require("net")
net.createServer((socket) =>
//just added
socket.on("error", (err) =>
console.log("Caught flash policy server socket error: ")
console.log(err.stack)
)
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)
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:
- net: no suprimir ECONNRESET (Ben Noordhuis)
Las versiones anteriores no producirían errores en las interrupciones del cliente. Una interrupción en la conexión del cliente arroja el error ECONNRESET en Node. 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.
require('net')
.createServer( function(socket)
{
// no nothing
})
.listen(21, function()
{
console.log('Socket ON')
})
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 versiones posteriores.
En producción, utilizo la v.0.10. algo y todavía da el error. Nuevamente, creo que esto está previsto y la solución es manejar el error en su código.