Discord.js斜杠命令报错:Option 'role'类型不匹配(预期3,实际8)
问题解决:Discord.js角色命令类型不匹配报错
错误原因
你用addRoleOption定义了role选项(类型为Role,对应内部代码8),但在执行逻辑里用options.getString("role")去获取这个选项——getString仅适用于字符串类型的选项(对应内部代码3),这就导致了类型不匹配的报错。
修复步骤
- 替换角色获取方法:把获取角色的代码从
getString改成getRole,直接获取Role对象,无需再处理角色ID。 - 修正描述文本:去掉选项描述里的
(id)字样,因为现在用户是直接选择角色而非输入ID;同时修正remove子命令里的笔误from from为remove from。 - 直接使用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
相关产品推荐
相关产品推荐

