Ошибка ECONNRESET сбой приложения NodeJS - PullRequest
0 голосов
/ 16 июня 2020

Я новичок в программировании, и мне нужна была помощь с одной ошибкой, которую я получаю.

Я запускаю приложение NodeJS (бот Discord. js), мой bot имеет функцию регистрации идентификатора пользователя в базе данных MySQL, когда пользователь вводит определенную команду. Иногда он работает нормально, но иногда вылетает с ошибкой 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
}

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Прежде всего, вы должны catch получить ошибку, чтобы приложение могло обработать ее правильно и не обнаружило sh, когда mysql соединение закрыто по какой-либо нечетной причине. Попробуйте использовать connection.on('error', ...) или блоки try-catch .

Для сохранения открытого соединения вы должны повторно подключиться при закрытии. Или просто используйте mysql объединение соединения , которое очень хорошо обрабатывает автоматическое c переподключение с одним изменением кода.

PS: Объединение нескольких подключений в пул обычно является хорошей идеей для приложений asyn c, таких как серверы, но безопасно поддерживать одно подключение через пул (connectionLimit : 1) только для автоматического c повторного подключения.

PPS: Mysql Тайм-аут бездействия может быть настроен на сервере my.cnf

0 голосов
/ 17 июня 2020

Я исправил проблему. Ошибка sh произошла из-за неактивности приложения в базе данных, а когда ошибка con. становится неактивным на пару секунд, сервер mysql закрывает соединение, заставляя бота выполнять sh, когда код требует некоторого ресурса базы данных.

Решение заключалось в создании функции для поддержания постоянной активности в БД соединение.

Вот код:

    con.query('SELECT 1', (err) => {
        if (err) throw err

        console.log('Tum tum')  \\ Heartbeat noises to know if it worked xD
    })
}
setInterval(keepAlive, 15000)```
...