discord.js带add/remove子命令的角色斜杠命令roles属性报错如何修复
修复思路&问题点整理
- 核心报错原因:你通过
interaction.options.getUser('member')获取到的是全局User对象,该对象不存储服务器内的角色信息,没有roles属性。只有服务器成员对象GuildMember才有roles属性,将获取目标的代码改为const Target = interaction.options.getMember('member')即可解决这一报错。
除此之外你代码里还有多处会导致运行报错的问题,需要同步修改:
- execute函数参数错误:斜杠命令的执行回调默认只会传入
interaction、client两个参数,你定义的message, guild, member都是未赋值的空值,后续message.guild.roles.find调用会直接报错。要获取当前服务器对象请从interaction.guild获取。 - 角色查找逻辑错误
- 你用单引号包裹
'${role}',模板字符串不会生效,实际会直接查找名字为${role}的角色 - discord.js v13+版本
roles集合的find方法需要传入回调函数,且需要从cache中读取
修正后代码:const findrole = interaction.guild.roles.cache.find(r => r.name === role);
- 你用单引号包裹
- 未定义变量调用:你回复内容里用到的
usr变量完全没有定义,替换为Target或者Target.user.tag即可。 - 角色操作传参错误:给用户添加角色时需要传入找到的角色对象
findrole,而不是你输入的角色名字符串role,改为Target.roles.add(findrole)。 - 逻辑顺序错误:移除角色的逻辑里,你先执行了移除操作才判断用户是否持有该角色,需要把判断逻辑放到移除操作之前。
核心执行逻辑修正示例
async execute(interaction, client) { const type = interaction.options.getString('type'); const roleName = interaction.options.getString('role'); const Target = interaction.options.getMember('member'); const findrole = interaction.guild.roles.cache.find(r => r.name === roleName); switch(type) { case "add" : { if (!findrole) { return interaction.reply({ content: `你输入的角色名不存在!`, ephemeral: false }); } await Target.roles.add(findrole); interaction.reply({ content: `已为${Target.user.tag}添加${roleName}角色`, allowedMentions: { users: []}}) break; } case "remove" : { if (!findrole) { return interaction.reply({ content: `角色不存在`, ephemeral: false }); } if (!Target.roles.cache.has(findrole.id)) { return interaction.reply({ content: `${Target.user.tag}未持有该角色`, allowedMentions: { users: []}}); } await Target.roles.remove(findrole); interaction.reply({ content: `已为${Target.user.tag}移除${roleName}角色`, allowedMentions: { users: []}}) break; } } }
注意:给角色操作添加
await避免异步逻辑混乱,同时要确保机器人的角色权限高于你要操作的角色,否则会抛出权限不足错误。
内容的提问来源于stack exchange,提问作者Rice
相关产品推荐
相关产品推荐

