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

Discord.js v14:如何通过ID移除用户角色并检查角色持有情况

问题解决:Discord.js 角色移除命令无法检查用户角色

错误根源及修正点:

  • 获取的是用户ID而非GuildMember对象
    interaction.options.get('user').value返回的是字符串格式的用户ID,并非Discord.js的GuildMember实例,所以没有roles属性。需要改用interaction.options.getMember('user')获取服务器成员对象,这个对象包含角色管理的相关方法。

  • 方法名错误
    JavaScript里不存在Contains方法(这是C#的语法),在Discord.js中检查成员是否拥有指定角色,正确用法是member.roles.cache.has(role.id),或者直接用member.roles.cache.includes(role)。

  • 角色对象获取方式冗余
    interaction.options.get('role').value得到的是角色ID,直接调用interaction.options.get('role')就能拿到完整的Role对象,更便于后续操作。

修正后的完整代码:

// 记得先导入ApplicationCommandOptionType
const { ApplicationCommandOptionType } = require('discord.js');

module.exports = {
    name: 'roleremove',
    description: 'Removes a specified role from a user.',
    options: [
        {
            name: 'user',
            description: 'The user to remove the role from.',
            required: true,
            type: ApplicationCommandOptionType.User,
        },
        {
            name: 'role',
            description: 'The role you want to remove',
            required: true,
            type: ApplicationCommandOptionType.Role,
        }
    ],

    callback: async (client, interaction) => {
        // 获取服务器成员对象(而非用户ID)
        const targetMember = interaction.options.getMember('user');
        // 获取完整的角色对象
        const targetRole = interaction.options.get('role');

        // 检查成员是否拥有该角色
        const alreadyHasRole = targetMember.roles.cache.has(targetRole.id);
        
        if (!alreadyHasRole) {
            return interaction.reply({ 
                content: `❌ | 无法移除${targetMember.user.tag}的角色,因为他们没有该角色。`, 
                ephemeral: true 
            });
        } 

        // 移除角色
        await targetMember.roles.remove(targetRole);
        interaction.reply({ 
            content: `✅ | 已成功移除${targetMember.user.tag}的${targetRole.name}角色。`, 
            ephemeral: true
        });
    }
};

额外注意事项:

  • 确保你的Bot拥有管理角色的权限,且Bot的角色位置要高于目标角色,否则无法执行移除操作。
  • 使用getMember只能在服务器内的命令中生效(DM中无法使用),符合角色管理命令的使用场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:20:03