You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js机器人随机停止监听Message事件排查求助

Discord机器人随机停止监听消息问题排查与修复

核心问题定位与修复

  1. 事件名称错误(直接导致监听失效的核心原因)
    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; // 匹配到第一个命令后停止遍历,避免重复执行
       }
   }
})
  1. 未处理异步操作异常
    代码中多个异步操作(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('命令执行出错了')
}
  1. 全局变量作用域问题
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:05:18