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

DiscordJS中roles.remove()函数无法使用问题求助

Discord按钮验证系统角色移除失败问题

问题描述

我想实现一个Discord验证系统:用户点击按钮后自动获得「Verified」角色,同时移除「New Player」角色。但调用roles.remove()时Bot直接崩溃,报错提示该函数不存在。目前已注释掉.remove()代码,附上相关代码及错误信息,寻求解决办法。

相关代码

const {CommandInteraction} = require('discord.js');

module.exports = {
    name: "interactionCreate",

    execute(interaction, client) {
        if (interaction.isChatInputCommand()) {
            const command = client.commands.get(interaction.commandName);

            if(!command) {
                interaction.reply({content: "outdated command"});
            }

            command.execute(interaction, client);
        } else if (interaction.isButton()) {
            const role = interaction.guild.roles.cache.get('1087590559826317353');
            const roleremove = interaction.guild.roles.cache.get('1087378029073924176');
            return interaction.member.roles
                //.remove(roleremove)
                .add(role)
                .then((member) => 
                    interaction.reply({
                        content: `${role} has been assigned to you.`, 
                        ephermal: true
                    }),
                );
        } else {
            return;
        }
    },
};

错误信息

>  .add(role)
                 ^

TypeError: interaction.member.roles.remove(...).add is not a function
    at Object.execute (C:\Users\neman\OneDrive\Desktop\Events\interactions\interactionCreate.js:20:18)
    at Client.<anonymous> (C:\Users\neman\OneDrive\Desktop\Handlers\eventHandler.js:25:63)
    at Client.emit (node:events:513:28)
    at InteractionCreateAction.handle (C:\Users\neman\OneDrive\Desktop\node_modules\discord.js\src\client\actions\InteractionCreate.js:97:12)
    at module.exports [as INTERACTION_CREATE] (C:\Users\neman\OneDrive\Desktop\node_modules\discord.js\src\client\websocket\handlers\INTERACTION_CREATE.js:4:36)
    at WebSocketManager.handlePacket (C:\Users\neman\OneDrive\Desktop\node_modules\discord.js\src\client\websocket\WebSocketManager.js:352:31)
    at WebSocketShard.onPacket (C:\Users\neman\OneDrive\Desktop\node_modules\discord.js\src\client\websocket\WebSocketShard.js:494:22)
    at WebSocketShard.onMessage (C:\Users\neman\OneDrive\Desktop\node_modules\discord.js\src\client\websocket\WebSocketShard.js:328:10)
    at callListener (C:\Users\neman\OneDrive\Desktop\node_modules\ws\lib\event-target.js:290:14)
    at WebSocket.onMessage (C:\Users\neman\OneDrive\Desktop\node_modules\ws\lib\event-target.js:209:9)

解决办法

1. 修复链式调用错误

roles.remove()和roles.add()都是异步操作,返回的是Promise对象而非可链式调用的GuildMemberRoleManager,因此不能直接链式调用。可以用Promise.all()同时执行添加和移除操作,提升效率。

2. 修正拼写错误

代码中ephermal是拼写错误,正确应为ephemeral,否则无法设置回复仅自己可见。

3. 添加错误捕获

加入错误捕获逻辑,避免Bot因权限不足、角色不存在等问题崩溃,同时方便排查问题。

完整修正后的按钮处理代码

else if (interaction.isButton()) {
    const role = interaction.guild.roles.cache.get('1087590559826317353');
    const roleremove = interaction.guild.roles.cache.get('1087378029073924176');
    
    // 同时执行添加和移除角色操作
    Promise.all([
        interaction.member.roles.add(role),
        interaction.member.roles.remove(roleremove)
    ])
    .then(() => {
        interaction.reply({
            content: `${role} 已为你分配,同时移除了「New Player」角色。`,
            ephemeral: true
        });
    })
    .catch(err => {
        interaction.reply({
            content: "角色操作失败,请联系管理员。",
            ephemeral: true
        });
        console.error("角色操作出错:", err);
    });
}

额外注意事项

  • 确保Bot拥有管理角色的服务器权限,且Bot的角色位置高于要添加/移除的角色,否则会因权限不足操作失败。
  • 若使用discord.js v13及以下版本,方法调用逻辑一致,但需确认版本兼容性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:47:09