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
相关产品推荐
相关产品推荐

