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

使用Discord.js v14修改用户昵称报错:setNickname不是函数

解决Discord.js v14中user.setNickname is not a function报错并实现修改用户昵称功能

错误原因

你调用user.setNickname()报错的核心问题是:interaction.options.getUser('user')获取的是Discord全局User对象,这个对象不包含服务器专属的属性和方法——昵称是用户在特定服务器内的标识,只有GuildMember(服务器成员)对象才拥有修改昵称的setNickname()方法。

解决方案

  1. 替换对象获取方式:使用getMember('user')替代getUser('user'),获取目标用户对应的服务器成员实例。
  2. 处理异步操作与错误:Discord API调用是异步的,需用async/await包裹;同时要处理权限不足等异常情况。

修正后的完整代码

斜杠命令注册代码(无需修改)

const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js');

const nick = new SlashCommandBuilder()
  .setName('nick')
  .setDescription('Change the nickname of a user')
  .setDefaultMemberPermissions(PermissionFlagsBits.ChangeNickname)
  .addUserOption((option) =>
    option
      .setName('user')
      .setDescription('The user to change the nickname')
      .setRequired(true),
  )
  .addStringOption((option) =>
    option.setName('nickname').setDescription('New nickname for the user'),
  );

交互处理逻辑(修正后)

client.on('interactionCreate', async (interaction) => {
  // 过滤非斜杠命令的交互
  if (!interaction.isChatInputCommand()) return;

  if (interaction.commandName === 'nick') {
    // 获取服务器成员对象(而非全局用户对象)
    const targetMember = interaction.options.getMember('user');
    const newNickname = interaction.options.getString('nickname');

    try {
      // 修改昵称,若newNickname为空则还原为用户默认用户名
      await targetMember.setNickname(newNickname);
      // 回复操作结果
      await interaction.reply({
        content: `已成功修改 ${targetMember.user.tag} 的昵称:${newNickname || '还原为默认用户名'}`,
        ephemeral: false
      });
    } catch (error) {
      // 捕获权限不足、无法修改所有者等异常
      console.error('修改昵称失败:', error);
      await interaction.reply({
        content: '修改失败,请检查机器人是否拥有「管理昵称」权限,或目标用户是否为服务器所有者',
        ephemeral: true // 仅命令发起者可见
      });
    }
  }
});

关键注意事项

  • 权限要求:机器人必须在目标服务器中拥有ManageNicknames权限,否则无法执行修改操作。
  • 所有者限制:无论权限如何,机器人都无法修改服务器所有者的昵称。
  • 空昵称处理:如果用户未提供nickname参数,setNickname(null)会将目标用户的昵称还原为其Discord全局用户名。
  • 异步处理:必须使用async/await或Promise链式调用处理API请求,避免未处理的异步错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:50:18