ECONNRESET错误导致NodeJS应用程序崩溃。

4

我对编程比较新,需要帮助解决一个错误。

我在运行一个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
}

因为这个问题没有提供最小可复现代码,而且调试细节是一张图片而不是复制粘贴的文本,所以被踩了。请参考https://stackoverflow.com/help/how-to-ask。 - Jonathan Rosa
@JonathanRosa 感谢您提供的信息,我已经编辑了我的帖子,但代码的格式不正确。 - Neru
我已经取消了踩的操作,并提交了一个编辑来修复格式。 - Jonathan Rosa
您可能想查看此相关问题:https://dev59.com/k6_la4cB1Zd3GeqPrVfl - Palo
2个回答

3
首先,您应该catch错误,这样您的应用程序可以正确处理并且不会在mysql连接关闭时崩溃。尝试使用connection.on('error',...)try-catch块
为保持连接打开,您应该在关闭后重新连接。或者简单地使用mysql的池化连接,它非常好地处理了自动重新连接,只需更改单个代码即可。
PS:对于像服务器这样的异步应用程序,汇集多个连接通常是一个好主意,但仅为了自动重新连接本身,通过池化维护单个连接是安全的connectionLimit:1
PPS:可以在服务器的my.cnf中配置Mysql的不活动超时时间。

1
我已经解决了问题。崩溃是由于数据库上的应用程序不活动造成的,当连接几秒钟不活动时,mysql服务器关闭连接,使得机器人在代码需要一些数据库资源时崩溃。
解决方案是创建一个函数来保持DB连接的持续活动。
以下是代码:
    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连接时,它仍然会崩溃。请参见下面的答案。 - ΔO 'delta zero'
@dayvee.cz,您的回复确实更加优化,整个过程保持连接会带来大量错误的空间。 - Neru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接