Discord Bot执行修改昵称命令时持续提示Missing Permissions错误
解决Discord Bot修改昵称时的"Missing Permissions"错误
问题原因分析
你的代码存在几个关键问题导致权限错误:
- 依赖缓存获取成员对象(
interaction.guild.members.cache.get),若成员不在缓存中会直接导致操作失败。 - 未等待异步操作完成,
setNickname是异步方法,直接调用会引发未处理的Promise异常。 - 未捕获错误,无法精准判断权限失败的具体原因(比如Bot无法修改服务器所有者昵称)。
修改后的代码
const {Client, GatewayIntentBits, SlashCommandBuilder} = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, ] }); client.on("ready", async () => { console.log("Bot is ready!"); const nicknameCH = new SlashCommandBuilder() .setName('changenick') .setDescription('修改你的昵称') .addStringOption(option => option.setName("newnick") .setDescription("新昵称") .setRequired(true) ); await client.application.commands.create(nicknameCH); }); client.on('interactionCreate', async (interaction) => { if(!interaction.isChatInputCommand()) return; if(interaction.commandName === 'changenick') { const newNick = interaction.options.getString("newnick"); const targetMember = interaction.member; // 直接使用交互内置的成员对象,无需依赖缓存 try { await targetMember.setNickname(newNick); await interaction.reply(`已将你的昵称修改为:${newNick}`); } catch (error) { let errorMsg = "修改昵称失败"; if(error.code === 50013) { if(targetMember.id === interaction.guild.ownerId) { errorMsg = "无法修改服务器所有者的昵称"; } else { errorMsg = "Bot权限不足,请确保Bot角色高于目标用户的所有角色,且拥有「管理昵称」权限"; } } await interaction.reply({content: errorMsg, ephemeral: true}); } } }); client.login(TOKEN);
额外注意事项
- Bot角色优先级:必须确保Bot的角色在服务器角色列表中位于所有普通用户角色之上,否则无法修改角色等级高于自己的用户昵称。
- 服务器所有者限制:Discord平台限制任何Bot修改服务器所有者的昵称,即使Bot拥有管理员权限也无法绕过这一规则。
- 权限确认:虽然管理员权限包含「管理昵称」权限,但如果使用自定义权限组,需明确为Bot分配
ManageNicknames权限。 - 意图优化:修改昵称仅需
Guilds和GuildMembers两个意图,你原代码中的GuildMessages、MessageContent属于多余配置,可移除以减少不必要的权限请求。
内容的提问来源于stack exchange,提问作者Warter
相关产品推荐
相关产品推荐

