Discord.js通过用户ID获取用户名报TypeError: Cannot read property 'tag' of undefined
问题原因排查
- 首先确认代码笔误:你描述中提到的
client.user.cache.get()是错误写法,client.user是机器人自身的用户对象,不存在cache属性,全局用户缓存挂载在client.users下,先排查实际运行代码是否存在此处拼写错误。 - 缓存机制限制:Discord.js默认不会缓存所有用户,仅会缓存与机器人有过交互、当前在线的用户,你数据库中存储的历史用户如果不在缓存列表中,
client.users.cache.get()就会返回undefined。 - 遍历得到的
userID格式异常:可以先打印userID的值和类型,和正常返回的message.author.id做对比,排查是否存在多余空格、类型非字符串等问题。
解决方法
- 优先复用本地存储字段:你的JSON存储结构中已经给每个用户ID绑定了
username字段,直接通过userdata[message.guild.id].users[userID].username读取即可,不需要调用接口获取,既避免缓存问题也能提升运行效率。 - 主动拉取用户信息:如果需要获取最新的用户标签,不要走本地缓存,调用官方fetch接口拉取:
// 该代码需要放在async函数内运行 try { const targetUser = await client.users.fetch(userID); console.log(targetUser.tag); } catch (error) { console.log(`ID为${userID}的用户信息拉取失败,可能是ID无效或用户已注销`, error); }
- 开启成员缓存权限:如果你使用的是v12及以上版本的Discord.js,需要在Discord开发者后台开启
GUILD_MEMBERS意图,同时在初始化client时传入该意图配置,才能正常拉取服务器内全量成员的信息。
内容的提问来源于stack exchange,提问作者WhenPigsInvade
相关产品推荐
相关产品推荐

