Discord.js机器人添加bot过滤判断后无法转移带反应的embed消息
问题原因
- 事件参数解析不全:
messageReactionAdd事件会返回reaction、user两个参数,你仅解构了消息对象,未获取触发反应的用户,无法正确过滤机器人自身触发的反应。 - 过滤逻辑错误:你当前判断的是
message.author.bot(原消息作者是否为机器人),但你需要过滤的是添加反应的主体是否为机器人,二者逻辑完全不匹配,这是你添加判断后功能失效的核心原因。 - 频道判断语法错误:
- 使用赋值运算符
=代替全等判断运算符===,会导致逻辑判断完全失效 - 频道ID取值错误,
message.guild.channels.id为无效属性,正确取值应为message.channel.id
- 使用赋值运算符
- 缺少需求要求的逻辑:没有根据反应类型匹配转发频道,也没有删除原频道的源消息。
修复后代码
client.on("messageCreate", message => { // 原有自动加反应逻辑保持不变 if (message.channel.id === analiseChannelID) { message.react(aprovada); message.react(nula); message.react(negada); } else if (message.channel.id === aprovadasChannelID) { message.react(arquivada); message.react(negada); } else if (message.channel.id === negadasChannelID) { message.react(arquivada); message.react(negada); } else if (message.channel.id === nulaChannelID) { message.react(arquivada); message.react(negada); } }); // 修复事件参数,拿到触发反应的user client.on("messageReactionAdd", async (reaction, user) => { // 过滤机器人自身添加的反应 if (user.bot) return; const message = reaction.message; // 仅处理待审核频道的消息反应 if (message.channel.id !== analiseChannelID) return; // 按表情匹配对应转发频道 let targetChannel; if (reaction.emoji.id === aprovada || reaction.emoji.name === aprovada) { targetChannel = message.client.channels.cache.get(aprovadasChannelID); } else if (reaction.emoji.id === negada || reaction.emoji.name === negada) { targetChannel = message.client.channels.cache.get(negadasChannelID); } else if (reaction.emoji.id === nula || reaction.emoji.name === nula) { targetChannel = message.client.channels.cache.get(nulaChannelID); } // 未匹配到对应表情直接终止 if (!targetChannel) return; try { // 转发embed await targetChannel.send({ embeds: message.embeds }); // 删除原频道的源消息 await message.delete(); } catch (err) { console.error("消息转发/删除失败:", err); } });
额外注意事项
- 如果你使用的是discord.js v14+版本,需要在客户端初始化时开启
MessageContent、GuildMessageReactions等相关意图,否则无法监听到消息反应事件。 - 如果你的反应表情是服务器自定义表情,判断时需要取
reaction.emoji.id匹配,如果是系统默认表情,取reaction.emoji.name匹配即可。
内容的提问来源于stack exchange,提问作者Maker__
相关产品推荐
相关产品推荐

