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

discord.js v13迁移Kick指令报message.guild.members不是函数如何解决

问题排查与修复方案

错误原因

你遇到的报错是discord.js v12到v13的API破坏性变更导致的:

  • v12版本中message.guild.members支持直接传入成员ID/成员对象调用,返回对应GuildMember实例
  • v13版本中message.guild.members改为只读的GuildMemberManager管理器对象,不可直接作为函数调用,因此抛出TypeError: message.guild.members is not a function错误

修复方案

你已经通过message.mentions.members.first()获取到了合法的GuildMember实例kicked,无需再从guild.members中重复查询,直接调用kicked.kick()即可,优化后的完整代码如下:

case 'kick':
case 'Kick':
    // 校验调用者权限
    if (!message.member.permissions.has(Discord.Permissions.FLAGS.KICK_MEMBERS)) return;
    // 获取被踢成员
    const kicked = message.mentions.members.first();
    if (!kicked) return;
    // 校验机器人自身权限,避免无权限报错
    if (!message.guild.me.permissions.has(Discord.Permissions.FLAGS.KICK_MEMBERS)) return;
    // 校验角色层级,避免踢权限比自己高的用户
    if (kicked.roles.highest.position >= message.guild.me.roles.highest.position) return;

    // 执行踢人操作,增加错误捕获避免崩溃
    kicked.kick()
        .then(() => {
            const kickemb = new Discord.MessageEmbed()
                .setColor('RED')
                .addField(`The User`, `${kicked} was kicked successfully!`)
                .setFooter(`The Kick was from ${message.author.tag}!`);
            message.channel.send({embeds: [kickemb]});
        })
        .catch(err => console.error('踢人操作失败:', err));
    break;

额外注意事项

  • 如果你需要主动从服务器成员列表查询指定成员,v13需要调用GuildMemberManager.fetch方法,写法为await message.guild.members.fetch(成员ID),该方法为异步方法需要配合async/await使用
  • 启动机器人时必须在Intents中开启GUILDS、GUILD_MESSAGES、GUILD_MEMBERS权限,否则无法正常获取成员对象
  • 注意在switch结构中每个case末尾增加break,避免逻辑穿透

内容的提问来源于stack exchange,提问作者I need Help

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:27:04