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
相关产品推荐
相关产品推荐

