Evitar o capturar Error leer ECONNRESET en TCP.onStreamRead

Estoy usando tomas para comunicarse con mis clientes. Ahora estoy recibiendo 10 veces al día un error:

{
  Error: read ECONNRESET at TCP.onStreamRead (internal/stream_base_commons.js:111:27) errno: 'ECONNRESET',
  code: 'ECONNRESET',
  syscall: 'read'
}

Agrego un evento en el servidor:

server.on('error', (err,socket) => {
  try {
    console.log('Server error:', err,socket)
    socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
    socket.Close(); 
  } catch(e){}
});

server.on('clientError', (err, socket) => {
  try{
    if (err.code === 'ECONNRESET' || !socket.writable) {
      console.error('__ECONNRESET',err,socket);
      return;
    }
    socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
  } catch(e){}
});

pero el proceso del servidor se reinicia.

Estoy en node versión v15.3.0, si eso importa.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por daniel1


2 Respuestas:

  • El error ECONNRESET indica que la conexión TCP fue restablecida por el otro extremo de la conexión de forma inesperada. Para evitar que este error cause que tu servidor se reinicie, puedes capturar este error y manejarlo de manera adecuada sin forzar el cierre del servidor.

    Aquí te dejo un ejemplo de cómo puedes manejar el error ECONNRESET en Node.js:

    javascript
    server.on('error', (err, socket) => {
      try {
        console.log('Server error:', err, socket);
        if (err.code === 'ECONNRESET') {
          console.error('Error: Connection reset by peer');
          // Manejar el error de conexión restablecida aquí
        } else {
          socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
        }
      } catch (e) {
        console.error('Error al manejar el error:', e);
      }
    });
    

    En este código, se verifica si el error es de tipo ECONNRESET y se imprime un mensaje indicando que la conexión fue restablecida por el otro extremo. Puedes agregar tu lógica para manejar este error de acuerdo a tus necesidades.

    Espero que esta solución te ayude a evitar que el proceso del servidor se reinicie debido a este error. Si necesitas más ayuda, ¡no dudes en preguntar!

    Respondida el Dec 18, 2020 a las 23:11 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error ECONNRESET se produce cuando el otro extremo de la conexión cierra la conexión abruptamente. Esto puede ocurrir por varias razones, como:

    El cliente cierra la conexión antes de que el servidor haya terminado de enviar datos. La red está interrumpida y se cierra la conexión.

    • El servidor se bloquea o se reinicia.

    En tu caso, parece que el error se está produciendo debido a que el cliente está cerrando la conexión antes de que el servidor haya terminado de enviar datos. Esto puede ocurrir si el cliente es un navegador web y el usuario cierra la pestaña o navega a otra página.

    Para evitar este error, puedes intentar implementar un mecanismo de nueva conexión. Esto significa que cuando se produce un error ECONNRESET, el servidor vuelve a establecer la conexión con el cliente. Esto garantizará que los datos se envíen correctamente al cliente.

    Aquí tienes un ejemplo de cómo implementar un mecanismo de nueva conexión:

    js
    // Escuchar errores en el servidor
    server.on('error', (err) => {
      console.error('Servidor error:', err);
    
      // Si el error es ECONNRESET, volver a establecer la conexión
      if (err.code === 'ECONNRESET') {
        console.log('Volver a establecer la conexión...');
        connectToServer();
      }
    });
    
    // Volver a establecer la conexión con el servidor
    function connectToServer() {
      // Lógica para volver a establecer la conexión con el servidor
    }
    

    Además de implementar un mecanismo de nueva conexión, también puedes intentar identificar y solucionar la causa del cierre abrupto de la conexión. Por ejemplo, si el error se produce cuando el usuario cierra la pestaña del navegador, puedes intentar mostrar un mensaje al usuario pidiéndole que espere a que se completen los datos.

    Respondida el Dec 18, 2020 a las 23:16 - por Gemini

    Votos positivos: 0 | Votos negativos: 0