discord.js如何获取反应触发的待审核机器人消息内容
解决方案
你之前的写法问题在于用messages.first().content拉取消息集合的首条内容,无法和审核员实际操作的待审核消息做绑定。实际上在messageReactionAdd事件中,回调参数里的reaction.message就精准指向当前被添加表情反应的那条消息,也就是你要找的对应待审核条目,直接从这个对象提取内容即可,完全不需要额外遍历消息列表。
修正后代码
注意要处理消息未缓存的边界情况,同时修复你原代码里interaction未定义的问题(messageReactionAdd事件回调中不存在interaction对象):
client.on("messageReactionAdd", async (reaction, user) => { // 跳过所有机器人账号触发的反应 if (user.bot) return; // 非审核频道的反应直接忽略 if (reaction.message.channel.id !== moderationChannel) return; // 拉取未缓存的消息/反应数据,避免老消息拿不到完整内容 if (reaction.partial) { try { await reaction.fetch(); } catch (err) { console.error("获取待审核消息失败:", err); return; } } const currentModerationMsg = reaction.message; if (reaction.emoji.name === "❌") { // 驳回:直接删除对应待审核消息 await currentModerationMsg.delete(); } else if (reaction.emoji.name === "✅") { // 提取当前待审核消息的内容,根据你转发到审核频道的格式二选一: // 1. 转发到审核频道的是纯文本消息,用这行 const messageContents = currentModerationMsg.content; // 2. 转发到审核频道的是Embed格式消息,注释掉上面那行,用这行 // const messageContents = currentModerationMsg.embeds[0]?.description; const publicMsg = new MessageEmbed() .setAuthor(`Anonymous Confession`, currentModerationMsg.guild.iconURL()) .setDescription(messageContents) .setFooter(`Type "/confess" to send a confession`) .setTimestamp(); // 发送到公共频道 const publicChannelInstance = client.channels.cache.get(publicChannel); await publicChannelInstance.send({ embeds: [publicMsg] }); // 发送完成后删除审核频道的对应待审核条目,避免重复操作 await currentModerationMsg.delete(); } });
关键说明
- 所有操作都围绕当前事件触发时的
reaction.message展开,天然和审核员点击反应的那条消息一一对应,哪怕审核频道同时存在上百条待审核消息也不会出现内容串线的问题 - 事件回调需要加
async关键字,因为消息拉取、发送、删除都是异步操作,不加会导致报错 - 审核通过/驳回后建议都删除审核频道内的对应消息,避免同一条内容被重复审核
内容的提问来源于stack exchange,提问作者codingliketheresnoyesterday
相关产品推荐
相关产品推荐

