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

Discord.js 封禁对指定消息添加特定表情的用户时出现报错如何解决

问题根因

messageReactionAdd事件返回的user是全局用户对象,仅包含用户通用信息,没有服务器维度的操作权限,而ban方法是服务器成员GuildMember实例的专属方法,所以会触发报错。

解决思路

从反应所属的服务器实例中拉取对应用户的GuildMember对象,再执行封禁操作,调整后的完整代码如下:

module.exports = {
    name: 'messageReactionAdd',
    async execute(client, reaction, user) {
        // 过滤机器人自身触发的反应、私信场景的反应
        if (user.bot || !reaction.message.guild) return;

        const channel = client.channels.cache.find(channel => channel.name === 'test');
        const targetMessageId = '874736592542105640';
        const banEmotes = ['kannathinking', '🍎'];

        if (targetMessageId === reaction.message.id && banEmotes.includes(reaction.emoji.name)) {
            try {
                // 从当前服务器拉取对应用户的GuildMember实例
                const member = await reaction.message.guild.members.fetch(user.id);
                // 执行封禁,可选配置删除用户过往消息的时长
                await member.ban({ deleteMessageSeconds: 86400 });
                channel.send(`${user} was banned`);
            } catch (err) {
                console.error('封禁失败:', err);
                channel.send(`无法封禁用户${user},请检查机器人权限`);
            }
        }
    }
}

注意事项

  • 需要在Discord开发者后台的机器人设置里开启GUILD_MEMBERS权限意图,否则无法正常拉取成员信息
  • 机器人的角色权限需要高于被封禁用户的角色,且本身拥有封禁成员的权限
  • 若使用较低版本的discord.js,拉取成员时可先尝试从缓存读取reaction.message.guild.members.cache.get(user.id),缓存不存在再走异步拉取逻辑

内容的提问来源于stack exchange,提问作者Max von der Mühle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:06:08