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

Discord.js机器人awaitReactions无法识别持指定角色用户的反应

错误原因

你的过滤器逻辑存在核心问题:reaction 对象本身不存在 member 属性,直接访问 reaction.member.roles 会返回 undefined,导致普通用户的反应始终无法通过校验,只有机器人自身的反应能匹配上你填写的机器人角色ID,所以才会出现你描述的现象。同时你没有过滤机器人自己的初始反应,会导致逻辑提前被机器人的表情触发。

修复后的代码

client.channels.cache.get("771101528386961428").send(embed).then(async function (message) {
    await message.react("👍")
    await message.react("👎")

    const filter2 = async (reaction, user) => {
        // 过滤机器人自身的反应
        if (user.bot) return false
        // 校验反应表情是否符合要求
        if (!['👍', '👎'].includes(reaction.emoji.name)) return false
        // 拉取反应用户的服务器成员实例
        const member = await message.guild.members.fetch(user.id).catch(() => null)
        if (!member) return false
        // 校验是否持有指定角色
        return member.roles.cache.has("873477291445985330")
    };

    message.awaitReactions({ filter: filter2, max: 1, time: 60000, errors: ['time'] })
        .then(collected => {
            const reaction = collected.first();
            if (reaction.emoji.name === '👍') {
                client.channels.cache.get("868298545269182495").send(Aembed)
            } else {
                message.author.send("Your request has been denied");
            }
        })
        .catch(collected => {
            console.log(`After a minute, only ${collected.size} reacted.`);
            message.reply('you didn\'t react with neither a thumbs up, nor a thumbs down.');
        });
});

额外注意事项

  • 如果你使用Discord.js v13及以上版本,需要在开发者后台开启机器人的GUILD_MESSAGE_REACTIONS特权意图,同时初始化客户端时声明该意图,否则无法接收用户反应事件。
  • 用roles.cache.has(角色ID)比roles.cache.find()判断角色权限的效率更高,更推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:24:01