ECONNRESET 错误崩溃 NodeJS 应用程序



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

我正在运行一个 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:UsersCeleronDesktopDiscordBotnode_modulesmysqllibConnection.js:423:8)
at Protocol.emit (events.js:315:20)
at Protocol._delegateError (C:UsersCeleronDesktopDiscordBotnode_modulesmysqllibprotocolProtocol.js:398:10)
at Protocol.handleNetworkError (C:UsersCeleronDesktopDiscordBotnode_modulesmysqllibprotocolProtocol.js:371:10)
at Connection._handleNetworkError (C:UsersCeleronDesktopDiscordBotnode_modulesmysqllibConnection.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
}

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

为了保持打开的连接,您应该在关闭时重新连接。或者简单地使用 mysql 的池化连接,它通过一次代码更改很好地处理了自动重新连接。

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

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

我解决了这个问题。 崩溃是由于应用程序在数据库上处于非活动状态而发生的,当 con. 变为非活动几秒钟时,MySQL 服务器会关闭 de 连接,使机器人在代码需要一些数据库资源时崩溃。

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

这是代码:

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

最新更新