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

Discord.js斜杠命令报错:Option 'role'类型不匹配(预期3,实际8)

问题解决:Discord.js角色命令类型不匹配报错

错误原因

你用addRoleOption定义了role选项(类型为Role,对应内部代码8),但在执行逻辑里用options.getString("role")去获取这个选项——getString仅适用于字符串类型的选项(对应内部代码3),这就导致了类型不匹配的报错。

修复步骤

  1. 替换角色获取方法:把获取角色的代码从getString改成getRole,直接获取Role对象,无需再处理角色ID。
  2. 修正描述文本:去掉选项描述里的(id)字样,因为现在用户是直接选择角色而非输入ID;同时修正remove子命令里的笔误from from为remove from。
  3. 直接使用Role对象操作:member.roles.add()和remove()方法可以直接接受Role对象,不需要额外转换。

修改后的完整代码

const { Client, SlashCommandBuilder, EmbedBuilder, PermissionFlagsBits } = require("discord.js");

module.exports = {
    data: new SlashCommandBuilder()
        .setName("role")
        .addSubcommand(subcommand => 
            subcommand.setName("add")
                .setDescription('Adds a role to a member.')
                .addUserOption(option => 
                    option.setName("target")
                        .setDescription("Select the user you wish to add the role to.")
                        .setRequired(true))
                .addRoleOption(option => 
                    option.setName("role")
                        .setDescription("The role you want to add to the user.")
                        .setRequired(true)))
        .addSubcommand(subcommand => 
            subcommand.setName("remove")
                .setDescription('Removes a role from a member.')
                .addUserOption(option => 
                    option.setName("target")
                        .setDescription("Select the user you wish to remove the role from.")
                        .setRequired(true))
                .addRoleOption(option => 
                    option.setName("role")
                        .setDescription("The role you want to remove from the user.")
                        .setRequired(true)))
        .setDescription("Roles")
        .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers),

    async execute(interaction) {
        const { guild, options } = interaction

        const user = options.getUser("target")
        const member = guild.members.cache.get(user.id);
        const role = options.getRole("role"); // 关键修改:用getRole替代getString

        const errEmbed = new EmbedBuilder()
            .setDescription('Something went wrong. Please try again later.')
            .setColor(0xc72c3b)

        if(interaction.options.getSubcommand() === "add")
        {
            const successEmbed = new EmbedBuilder()
                .setTitle("**:white_check_mark: Added Role**")
                .setDescription(`Successfully added the role **${role.name}** to ${user}.`)
                .setColor(0x5fb041)
                .setTimestamp();

            if(!interaction.guild.members.me.permissions.has(PermissionFlagsBits.ModerateMembers))
                return interaction.reply({ embeds: [errEmbed], ephemeral: true });

            try {
                await member.roles.add(role); // 直接传入Role对象
                interaction.reply({ embeds: [successEmbed], ephemeral: true });
            } catch (err) {
                console.log(err);
                interaction.reply({ embeds: [errEmbed], ephemeral: true });
            }
        }
        else if(interaction.options.getSubcommand() === "remove")
        {
            const successEmbed = new EmbedBuilder()
                .setTitle("**:white_check_mark: Removed Role**")
                .setDescription(`Successfully removed the role **${role.name}** from ${user}.`)
                .setColor(0x5fb041)
                .setTimestamp();

            if(!interaction.guild.members.me.permissions.has(PermissionFlagsBits.ModerateMembers))
                return interaction.reply({ embeds: [errEmbed], ephemeral: true });

            try {
                await member.roles.remove(role); // 直接传入Role对象
                interaction.reply({ embeds: [successEmbed], ephemeral: true });
            } catch (err) {
                console.log(err);
                interaction.reply({ embeds: [errEmbed], ephemeral: true });
            }
        }
    }
}

额外优化说明:

  • 给addRoleOption加上setRequired(true),确保用户必须选择角色,避免空值错误
  • 在成功嵌入消息里显示角色名称,让操作反馈更直观
  • 捕获错误后同步给用户错误提示,而非仅在控制台打印

内容的提问来源于stack exchange,提问作者Bob Dylan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:50:37