Discord.js升级后报错TypeError: client.users.get不是函数求助
问题分析与解决办法
错误原因
你遇到的TypeError: client.users.get is not a function,是因为discord.js从v12版本开始重构了数据存储结构——所有用户、角色、成员等实体都被移到了对应的cache集合中,旧版v11直接调用client.users.get()的方式已被移除。
除了这个错误,你的代码里还有其他几处和版本升级不兼容的API用法,下面一并修正。
具体修正步骤
1. 替换client.users.get
将client.users.get('BOTSCLIENTID')改为client.users.cache.get('BOTSCLIENTID'),必须通过cache集合才能访问用户数据。
2. 替换废弃的message.isMentioned
message.isMentioned()方法在v12已被废弃,改用message.mentions.users.has()来检查是否提及了指定用户:
// 原代码 if (message.isMentioned(client.users.get('BOTSCLIENTID'))) // 替换为 if (message.mentions.users.has('BOTSCLIENTID'))
3. 修正角色查找逻辑
角色集合同样需要通过cache访问,把message.guild.roles.find改为message.guild.roles.cache.find。
4. 替换member.addRole
v12中添加角色的方法从member.addRole(role)改为member.roles.add(role),角色操作被整合到了member.roles对象下。
修正后的完整代码
// add and remove roles if (msg.includes(prefix + 'SUBSCRIBE')) { if (message.mentions.users.has('BOTSCLIENTID')) { message.channel.send("I cannot subscribe to myself, but if I could I would.") return } } else if (msg.startsWith(prefix + 'SUBSCRIBE')) { let role = message.guild.roles.cache.find(r => r.name === "subscriber"); let member = message.mentions.members.first(); // 提前判断角色和成员是否存在,避免无意义报错 if (!role) return message.channel.send("未找到subscriber角色"); if (!member) return message.channel.send("请提及要添加角色的成员"); member.roles.add(role).catch(console.error); message.channel.send("You have successfully subscribed."); }
版本变化关键点总结
- 缓存系统重构:v12开始,discord.js引入缓存管理器,所有用户、角色、成员、频道等数据都需要通过对应实体的
cache属性访问,比如client.users.cache、message.guild.roles.cache。 - API方法迁移:很多实例方法被重构,比如角色添加/移除从
member.addRole()/member.removeRole()迁移到member.roles.add()/member.roles.remove()。 - 废弃方法移除:像
message.isMentioned()这类旧方法被废弃,改用更精准的mentions集合的has()方法。
内容的提问来源于stack exchange,提问作者evaunit13
相关产品推荐
相关产品推荐

