Soy un poco nuevo en la codificación y necesitaba ayuda con un error que estoy recibiendo.
Estoy ejecutando una aplicación NodeJS (un bot Discord.js), mi bot tiene la función de registrar la ID de un usuario en una base de datos MySQL cuando el usuario escribe un determinado comando. A veces funciona bien, pero otras veces falla con un error ECONNRESET :
events.js:292 throw er; // Unhandled 'error' event ^ Error: read ECONNRESET at TCP.onStreamRead (internal/stream_base_commons.js:205:27) Emitted 'error' event on Connection instance at: at Connection._handleProtocolError (C:\Users\Celeron\Desktop\DiscordBot\node_modules\mysql\lib\Connection.js:423:8) at Protocol.emit (events.js:315:20) at Protocol._delegateError (C:\Users\Celeron\Desktop\DiscordBot\node_modules\mysql\lib\protocol\Protocol.js:398:10) at Protocol.handleNetworkError (C:\Users\Celeron\Desktop\DiscordBot\node_modules\mysql\lib\protocol\Protocol.js:371:10) at Connection._handleNetworkError (C:\Users\Celeron\Desktop\DiscordBot\node_modules\mysql\lib\Connection.js:418:18) at Socket.emit (events.js:315:20) at emitErrorNT (internal/streams/destroy.js:92:8) at emitErrorAndCloseNT (internal/streams/destroy.js:60:3) at processTicksAndRejections (internal/process/task_queues.js:84:21) { errno: 'ECONNRESET', code: 'ECONNRESET', syscall: 'read', fatal: true }En primer lugar, debe catch el error, para que su aplicación pueda manejarlo correctamente y no se bloquee cuando la conexión mysql se cierra por alguna extraña razón. Pruebe con connection.on('error', ...) o con bloques try-catch .
Para mantener una conexión abierta, debe volver a conectarse al cerrar. O simplemente use la conexión de agrupación de mysql, que maneja muy bien la reconexión automática, con un solo cambio de código.
PD: La agrupación de varias conexiones suele ser una buena idea para las aplicaciones asíncronas, como los servidores, pero es seguro mantener una única conexión a través de la agrupación ( connectionLimit : 1 ) solo para la reconexión automática.
PPS: el tiempo de espera de inactividad de Mysql se puede configurar en my.cnf del servidor
Solucioné el problema. El bloqueo ocurrió debido a la inactividad de la aplicación en la base de datos, y cuando se produjo la estafa. se vuelve inactivo durante un par de segundos, el servidor mysql cierra la conexión y hace que el bot se bloquee cuando el código requiere algún recurso de la base de datos.
La solución fue crear una función para mantener una actividad constante en la conexión DB.
Aquí está el código:
con.query('SELECT 1', (err) => { if (err) throw err console.log('Tum tum') \\ Heartbeat noises to know if it worked xD }) } setInterval(keepAlive, 15000)```