Discord.js开发:如何获取消息发送者并校验其执行mute命令的权限
问题原因
你遇到的报错是因为Discord.js的Message对象本身不存在user和sender两个属性,读取这两个不存在属性的permission字段时就会抛出undefined读取错误,同时你提到的权限判断写法也确实存在问题。
修复后的完整代码
name: 'mute', description: 'mutes someone', execute(message,args) { const target = message.mentions.members.first(); const muteRole = message.guild.roles.cache.find(role => role.name === 'MUTED') // 先校验MUTED角色是否存在,避免后续赋值报错 if (!muteRole) return message.channel.send("未找到MUTED角色,请先创建对应角色后再使用禁言命令") // 没有提到目标用户 或 发送者没有管理角色权限时直接返回提示 if(!target || !message.member.permissions.has('MANAGE_ROLES') ) { return message.channel.send("你没有权限禁言该用户") } // 执行禁言逻辑 target.roles.add(muteRole) message.channel.send("用户已被禁言") }
核心修改说明
- 移除了不存在的
message.user、message.sender调用,替换为正确的message.member获取发送者在当前服务器的成员对象,只有GuildMember类型才包含服务器内权限属性 - 将错误的单数
permission改为正确的复数permissions属性 - 新增MUTED角色存在性判断,避免找不到角色时后续操作抛出异常
- 简化了冗余的二次权限判断逻辑,优化代码结构
- 如果你使用的是Discord.js v14及以上版本,权限判断需要修改为
!message.member.permissions.has(PermissionFlagsBits.ManageRoles),同时需要在文件头部导入PermissionFlagsBits枚举。
内容的提问来源于stack exchange,提问作者Ethan Agar
相关产品推荐
相关产品推荐

