Discord.js机器人随机停止监听Message事件排查求助
Discord机器人随机停止监听消息问题排查与修复
核心问题定位与修复
- 事件名称错误(直接导致监听失效的核心原因)
Discord.js v14及以上版本中,消息创建事件的名称已从Message改为MessageCreate,你当前使用DISCORD.Events.Message无法正确触发监听。
修改事件监听代码:
// 替换原有的Message事件监听 client.on(DISCORD.Events.MessageCreate, async (message) => { console.log(message.channel.name) if (message.author.bot) return if (!message.content.startsWith(bot_mention)) return message.content = message.content.slice(bot_mention.length + 1) // 改用for...of循环替代forEach,避免异步遍历的逻辑混乱 for (const command of COMMANDS) { if (message.content.startsWith(command.command)){ message.content = message.content.slice(command.command.length) await command.execute(message) break; // 匹配到第一个命令后停止遍历,避免重复执行 } } })
- 未处理异步操作异常
代码中多个异步操作(channels.fetch、command.execute)未添加错误捕获,一旦出现异常可能导致进程静默崩溃或网关连接中断,表现为停止监听消息。
- 给启动阶段的异步操作添加错误捕获:
client.on(DISCORD.Events.ClientReady, async client => { console.log('Bot is running') try { const channel = await client.guilds.cache.get('guild_id').channels.fetch('channel_id') await channel.send('Ready!') bot_mention = client.user.toString() } catch (err) { console.error('启动时发送消息失败:', err) } });
- 给命令执行逻辑添加错误捕获:
// 在command.execute处添加try/catch try { await command.execute(message) } catch (err) { console.error('命令执行失败:', err) await message.reply('命令执行出错了') }
- 全局变量作用域问题
bot_mention未使用let/const声明,属于全局变量,可能因作用域污染导致意外值,建议改为模块级变量:
// 在文件顶部声明 let bot_mention; client.on(DISCORD.Events.ClientReady, async client => { // ... bot_mention = client.user.toString() });
权限与API限制排查
- 权限检查:确保机器人在目标服务器拥有以下权限:
- 查看频道(View Channel)
- 读取消息历史(Read Message History)
- 发送消息(Send Messages)
- 读取消息内容(Read Message Content,需在Discord开发者门户开启对应特权网关意图)
- API限制与网关状态:
- 查看控制台是否有Discord API返回的429速率限制错误,若有则需优化代码中的请求频率
- 添加网关状态监听,确认是否是连接中断导致的监听停止:
client.on(DISCORD.Events.Disconnect, () => { console.log('网关连接断开,正在尝试重连...') }) client.on(DISCORD.Events.Reconnecting, () => { console.log('正在重新连接网关...') })
内容的提问来源于stack exchange,提问作者Xmajkl
相关产品推荐
相关产品推荐

