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
相关产品推荐
相关产品推荐

