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

Discord.js审批系统awaitReactions无法识别指定表情反应问题求助

表情反应监听超时问题解决方案

根因梳理

你当前遇到的超时问题由以下几个常见错误叠加导致:

  • 监听对象绑定错误:你当前是对用户触发命令的原始消息调用awaitReactions,但你需要监听的是bot自身发送的embed消息,自然捕捉不到用户对bot消息的表情操作。
  • API参数格式不匹配:discord.js v13及以上版本中,awaitReactions不再接受filter作为第一个独立参数,需要将filter放入配置项中,旧写法会导致过滤规则完全不生效。
  • 用户属性取值错误:普通前缀命令的触发用户属性为message.author,你代码中用到的message.user属于无效属性,取值为undefined,导致过滤规则永远不满足,直接触发超时。
  • 未过滤bot自身操作:bot主动给消息添加的表情也会触发反应事件,需要主动排除bot身份的用户避免逻辑异常。

修正后实现代码

// 第一步:发送你要监听反应的embed消息,拿到该消息的实例
const botEmbedMsg = await message.channel.send({ embeds: [你自己定义的embed对象] });
// 给bot发送的embed消息添加初始表情
await botEmbedMsg.react('👍');
await botEmbedMsg.react('👎');

// 正确的过滤规则
const filter = (reaction, user) => {
    return ['👍', '👎'].includes(reaction.emoji.name) 
        && user.id === message.author.id // 校验操作的是触发命令的用户
        && !user.bot; // 排除bot自己加的表情
};

// 正确调用awaitReactions,对bot发送的消息监听,filter放入配置项
botEmbedMsg.awaitReactions({ filter, max: 1, time: 60000, errors: ['time'] })
    .then(collected => {
        const reaction = collected.first();
        if (reaction.emoji.name === '👍') {
            message.channel.send('你已同意该申请');
        } else {
            message.reply('你已驳回该申请');
        }
    })
    .catch(collected => {
        console.log(`1分钟内仅收到${collected.size}个有效反应`);
        message.reply('操作超时,未收到你的有效反馈');
        // 可选:超时后清空消息上的所有表情,避免后续误触发
        botEmbedMsg.reactions.removeAll().catch(err => console.error('清空反应失败', err));
    });

额外校验项

如果修改后仍有问题,请检查以下配置:

  • 你在discord开发者后台给bot开启了GUILD_MESSAGE_REACTIONS、DIRECT_MESSAGE_REACTIONS网关权限
  • 初始化Discord Client的时候已经传入了上述对应的意图配置
  • 如果是斜杠命令场景,将message.author.id替换为interaction.user.id即可,其余逻辑不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 22:24:02