我是一个编程新手,我需要一些帮助来解决我遇到的一个错误。
我正在运行一个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
}
发布于 2020-06-17 08:07:59
首先,你应该catch
这个错误,这样你的应用程序就可以正确地处理它,而不会在mysql连接由于任何奇怪的原因而关闭时崩溃。尝试使用connection.on('error', ...)
或try-catch blocks。
为了保持打开的连接,您应该在关闭时重新连接。或者简单地使用mysql的pooling connection,它可以很好地处理自动重新连接,只需更改一次代码。
PS:池化多个连接通常是异步应用程序(如服务器)的好主意,但通过池化(connectionLimit : 1
)维护单个连接是安全的,只是为了自动重新连接本身。
PPS:可以在服务器的my.cnf
中配置Mysql的非活动超时
发布于 2020-06-17 07:25:51
我解决了这个问题。崩溃的发生是因为应用程序在数据库上处于不活动状态,并且当。当代码需要一些数据库资源时,mysql服务器会关闭连接,使bot崩溃。
解决方案是创建一个函数来保持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)```
https://stackoverflow.com/questions/62416274
复制相似问题