Discord机器人等级系统出现Mongoose "Topology was destroyed"错误求解决
问题原因分析
- 最直接的触发原因是
setTimeout调用错误:你在addXP函数中直接执行了removeTimeout方法,而非将其作为回调函数延迟60秒执行。此时addXP的finally代码块已经将Mongoose连接关闭,removeTimeout执行数据库更新操作时连接已销毁,直接触发该报错。 - 其次你采用的是每次数据库操作都新建连接、操作完成立即关闭的短连接逻辑,这种模式在Discord机器人等高并发场景下极易出现时序冲突:频繁的开关连接会导致后续请求拿到的连接实例提前被其他请求的关闭操作销毁,也会触发该报错。
- 额外注意你代码里存在笔误:调用的
remoteTimeout方法名和定义的removeTimeout不一致,也会引发额外运行错误。
修复方案
1. 修正setTimeout写法
将addXP函数末尾的延迟调用代码修改为:
if (changedleveldata == true) { // 用箭头函数包裹,避免立即执行方法 setTimeout(() => removeTimeout(`guild${guild.id}member${member.id}`), 60000) }
2. 优化数据库连接逻辑
去掉每次操作前后的新建/关闭连接逻辑,改为项目启动时全局初始化一次Mongoose连接,全程复用连接:
// 项目启动时执行一次即可,不需要每次操作都重复调用 mongoose.connect('你的MongoDB连接地址') .then(() => console.log('数据库连接成功')) .catch(err => console.log('连接失败', err))
后续所有数据库操作直接调用模型方法即可,不需要再调用mongo()获取连接,也不需要调用mongoose.connection.close()关闭连接,Mongoose会自动维护连接池处理并发请求。
内容的提问来源于stack exchange,提问作者VioPaige
相关产品推荐
相关产品推荐

