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

discord.js带add/remove子命令的角色斜杠命令roles属性报错如何修复

修复思路&问题点整理
  • 核心报错原因:你通过interaction.options.getUser('member')获取到的是全局User对象,该对象不存储服务器内的角色信息,没有roles属性。只有服务器成员对象GuildMember才有roles属性,将获取目标的代码改为const Target = interaction.options.getMember('member')即可解决这一报错。

除此之外你代码里还有多处会导致运行报错的问题,需要同步修改:

  1. execute函数参数错误:斜杠命令的执行回调默认只会传入interaction、client两个参数,你定义的message, guild, member都是未赋值的空值,后续message.guild.roles.find调用会直接报错。要获取当前服务器对象请从interaction.guild获取。
  2. 角色查找逻辑错误
    • 你用单引号包裹'${role}',模板字符串不会生效,实际会直接查找名字为${role}的角色
    • discord.js v13+版本roles集合的find方法需要传入回调函数,且需要从cache中读取
      修正后代码:const findrole = interaction.guild.roles.cache.find(r => r.name === role);
  3. 未定义变量调用:你回复内容里用到的usr变量完全没有定义,替换为Target或者Target.user.tag即可。
  4. 角色操作传参错误:给用户添加角色时需要传入找到的角色对象findrole,而不是你输入的角色名字符串role,改为Target.roles.add(findrole)。
  5. 逻辑顺序错误:移除角色的逻辑里,你先执行了移除操作才判断用户是否持有该角色,需要把判断逻辑放到移除操作之前。

核心执行逻辑修正示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:27:06