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

Discord.js机器人自回复问题:发送消息后触发默认回复至超时

解决Discord.js机器人自动循环回复及命令小写识别问题

看起来你遇到了两个典型的Discord.js开发坑:机器人发消息后触发无限循环回复直到超时,还有命令小写识别不生效的问题。我来帮你一步步拆解解决:

一、机器人自动循环回复超时的问题

这个问题90%的概率是机器人触发了自己的消息监听逻辑,导致无限循环。比如机器人发送Fortnite added!后,自己的messageCreate事件又捕获到这条消息,重复执行命令,直到触发Discord的API超时限制。

解决步骤:

  • 优先过滤机器人自身消息:在消息监听事件的最开头,先判断发送者是不是机器人自己,如果是直接返回,不处理后续逻辑。代码示例:
    client.on('messageCreate', (message) => {
      // 关键:跳过机器人自己发的消息,避免循环触发
      if (message.author.bot) return;
      
      // 剩下的命令处理逻辑...
    });
    
  • 检查命令匹配规则是否过于宽松:如果你的命令是通过“包含关键词”触发(比如只要消息里有fortnite就执行),那机器人发送的Fortnite added!里的关键词会再次触发命令。这时候要改成严格匹配前缀+命令名,比如只有以!开头的消息才会被当作命令处理,像上面代码里后续可以加if (!message.content.startsWith(prefix)) return;。
  • 排查重复的消息监听:如果你的项目里(包括命令文件)有多个messageCreate事件监听,会导致同一条消息被多次处理,也可能引发循环。确保整个项目只有一个核心的消息监听入口。

二、命令小写识别不生效的问题

你已经尝试设置小写识别但没解决,大概率是处理流程里漏了某个环节:

  • 统一转换用户输入为小写:提取命令名的时候,一定要把用户的输入转成小写,再和命令的名称匹配。比如:
    const prefix = '!';
    const commandName = message.content.slice(prefix.length).trim().split(' ')[0].toLowerCase();
    
  • 确保命令文件里的名称是小写:如果你的命令文件导出的name是大写(比如name: 'Fortnite'),那转成小写后的commandName(fortnite)就无法匹配。所以命令文件里的name要统一用小写:
    // fortnite.js 命令文件示例
    module.exports = {
      name: 'fortnite', // 小写命令名
      execute(message, args) {
        message.channel.send('Fortnite added!');
      }
    };
    
  • 兼容大小写的匹配方式:如果不想改命令文件的名称,也可以在匹配时把命令的名称也转成小写,比如:
    const command = client.commands.find(cmd => cmd.name.toLowerCase() === commandName);
    

完整的核心消息处理示例

把上面的要点整合起来,你的bot.js里的消息处理逻辑应该类似这样:

const { Client, Collection, GatewayIntentBits } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent] });
client.commands = new Collection();
// 这里加载你的命令文件(比如通过fs模块读取commands目录下的文件)...

client.on('messageCreate', async (message) => {
  // 过滤机器人消息
  if (message.author.bot) return;
  
  const prefix = '!';
  // 过滤非命令消息
  if (!message.content.startsWith(prefix)) return;
  
  // 提取小写命令名
  const args = message.content.slice(prefix.length).trim().split(/ +/);
  const commandName = args.shift().toLowerCase();
  
  // 匹配命令(支持别名的话可以加aliases判断)
  const command = client.commands.get(commandName) || client.commands.find(cmd => cmd.aliases?.includes(commandName));
  if (!command) return;
  
  // 执行命令并捕获错误
  try {
    await command.execute(message, args);
  } catch (error) {
    console.error(error);
    await message.reply('执行命令时出错了!');
  }
});

client.login('你的机器人令牌');

按照这些步骤排查,应该能解决你的两个问题。如果还有疑问,可以检查一下命令加载逻辑是否正确,或者有没有其他的事件监听干扰了消息处理。

内容的提问来源于stack exchange,提问作者Keolor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:55:37