discord.js报错:members.get is not a function解决方案
报错原因
- 你当前使用的discord.js为v12及以上版本,该版本对资源管理器做了重构:
Guild(服务器对象)的members属性是GuildMemberManager成员管理器实例,而非直接存储成员数据的Collection集合,本身没有get方法,直接调用就会抛出is not a function的错误。v11及更早版本中members直接为Collection集合可直接调用get,v12之后所有资源管理器(包括成员、频道、角色管理器)都将实际存储数据的Collection放在cache属性下,调用时需要先访问cache。 - 代码存在隐藏风险:如果
client.guilds.cache.get('980553630480474232')没有返回对应服务器(触发场景包括机器人未就绪、服务器ID填写错误、机器人未加入该服务器),会先触发访问undefined属性的前置报错。
修复方案
基础修复(适配缓存场景)
在members后追加cache属性访问内部缓存的成员集合,再调用get方法,同时补充空值校验避免前置报错:
const targetGuild = client.guilds.cache.get('980553630480474232'); if (!targetGuild) return interaction.reply('目标服务器不存在'); const member = targetGuild.members.cache.get(interaction.user.id);
简便写法(交互场景推荐)
如果代码是在对应服务器内触发的交互回调中执行,不需要从全局客户端缓存逐层查找,直接取交互对象上挂载的成员属性即可,性能更高也不容易写错:
const member = interaction.member;
适配未缓存场景
如果你关闭了部分成员缓存、或者需要确保拿到最新的成员数据,可以用fetch方法异步拉取,该方法会优先读取缓存,缓存不存在时主动请求Discord接口获取最新数据:
const targetGuild = client.guilds.cache.get('980553630480474232'); if (!targetGuild) return interaction.reply('目标服务器不存在'); // 注意所在函数需要加async关键字 const member = await targetGuild.members.fetch(interaction.user.id);
内容的提问来源于stack exchange,提问作者Novato Original
相关产品推荐
相关产品推荐

