【问题标题】:ECONNRESET error crashing NodeJS applicationECONNRESET 错误导致 NodeJS 应用程序崩溃
【发布时间】:2020-10-06 12:30:05
【问题描述】:

我对编码有点陌生,我需要一些帮助来解决我遇到的一个错误。

我正在运行一个 NodeJS 应用程序(一个 Discord.js 机器人),当用户键入某个命令时,我的机器人具有将用户 ID 注册到 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
}

【问题讨论】:

  • 投了反对票,因为这个问题没有提供最少的可重现代码;调试细节也是一个图像,而不是复制粘贴。见stackoverflow.com/help/how-to-ask
  • @JonathanRosa 感谢您提供的信息,我编辑了我的帖子,但代码的格式不应该是.....
  • 我删除了反对票并提交了修改以修复格式。
  • 您可能需要检查这个相关问题:stackoverflow.com/questions/52978278/…

标签: mysql node.js discord.js


【解决方案1】:

首先,您应该catch 错误,以便您的应用程序可以正确处理它并且不会在mysql连接因任何奇怪原因而关闭时崩溃。尝试使用connection.on('error', ...)try-catch blocks

为了保持打开的连接,您应该在关闭时重新连接。或者干脆使用mysql的pooling connection,它可以很好地处理自动重新连接,只需更改一次代码。

PS:对于异步应用程序(如服务器)来说,池化多个连接通常是一个好主意,但通过池化 (connectionLimit : 1) 维护单个连接是安全的,仅用于自动重新连接本身。

PPS:Mysql的不活动超时可以在服务器的my.cnf中配置

【讨论】:

    【解决方案2】:

    我解决了这个问题。 崩溃是由于数据库上的应用程序不活动而发生的,并且当 con.当代码需要一些数据库资源时,mysql服务器会关闭断开连接,从而使机器人崩溃几秒钟。

    解决方案是创建一个函数来保持数据库连接中的持续活动。

    代码如下:

        con.query('SELECT 1', (err) => {
            if (err) throw err
    
            console.log('Tum tum')  \\ Heartbeat noises to know if it worked xD
        })
    }
    setInterval(keepAlive, 15000)```
    

    【讨论】:

    • 我认为这不是最好的解决方案,主要是因为您的应用在由于其他原因失去 mysql 连接时仍然会崩溃。请参阅下面的答案。
    • @dayvee.cz 你的反应确实更理想,在整个过程中保持连接打开会产生大量错误的空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2015-09-22
    • 2015-10-21
    • 2016-06-04
    • 2011-08-24
    • 2014-05-03
    相关资源
    最近更新 更多