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

Discord.js机器人被@提及回复次数随命令使用递增如何解决

问题根源

你当前的bug是因为重复注册了message事件监听器:你把client.on('message', ...)这段监听@提及的代码放在了message事件的回调函数内部,每收到一条符合前缀要求的命令消息,就会给client新增一个message事件监听器。后续有人@机器人的时候,所有已经注册的监听器都会同时触发,自然就会出现回复次数等于之前命令使用次数的情况。

另外你代码中还有两个冗余错误:

  • 存在重复的前缀判断逻辑,第一条if (!message.content.startsWith(prefix)) return;会直接把非前缀的消息(也就是@机器人的消息)提前拦截,所以刚启动还没注册监听器的时候@机器人不会有任何反应
  • 不需要在已有的message事件回调里额外注册新的message事件监听器,当前模块本身就是message事件的处理回调,直接把@识别的逻辑写在这里即可

修正后的message.js代码

require('dotenv').config();
const { MessageEmbed } = require('discord.js');

module.exports = async (Discord, client, message) => {
    const prefix = process.env.PREFIX;
    // 先过滤机器人自己发送的消息
    if(message.author.bot) return;

    // 处理@提及回复逻辑
    if (!message.content.includes("@here") && !message.content.includes("@everyone") && message.mentions.has(client.user.id)) {
        const embed = new MessageEmbed()
        .setColor("RANDOM")
        .setTitle("<:mentionic:878935275068334090> Oznaczyłeś/aś mnie!")
        .setDescription("Mój prefix na tym serwerze to `!` \n Użyj !help aby poznać listę komend!")
        message.channel.send(embed);
    }

    // 处理命令执行逻辑
    if(!message.content.startsWith(prefix)) return;

    const args = message.content.slice(prefix.length).split(/ +/);
    const cmd = args.shift().toLowerCase();
    const command = client.commands.get(cmd) || client.commands.find(a => a.aliases && a.aliases.includes(cmd));
    
    if(command) command.execute(client, message, cmd, args, Discord);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:36:01