discord.js经济系统排行榜报错Cannot read property 'tag' of undefined求助
错误原因
这个报错是因为client.users.cache.get(money[i].ID.slice(6))返回了undefined,你尝试访问undefined的tag属性才触发了报错,常见触发场景:
- 对应ID的用户不在机器人的本地缓存中,discord.js默认只会缓存和机器人有过交互、处于共同服务器的用户
- 存储的钱包ID格式异常,
slice(6)截取后得到的不是合法的Discord用户ID - 对应用户账号已被销毁,无法获取到用户信息
修复代码
你可以在拼接排行榜内容前增加非空判断,对取不到的用户做兜底展示,同时可以增加用户ID合法性校验,修改后的代码如下:
if(message.content.toLowerCase() === `${prefix}rich` || message.content.toLowerCase() === `${prefix}lb` || message.content.toLowerCase() === `${prefix}leaderboard`) { let money = db.all().filter(data => data.ID.startsWith(`wallet`)).sort((a, b) => b.data - a.data) money.length = 10 var finalLb = "" for(var i in money) { // 先提取用户ID,增加格式校验 const userId = money[i].ID.slice(6) if(!userId || userId.length !== 18) { finalLb += `**${Number(i)+1})** *未知用户* :- \`$${money[i].data.toLocaleString()}\`\n` continue } // 取用户,取不到就兜底 const user = client.users.cache.get(userId) const userTag = user ? user.tag : "*未知用户*" finalLb += `**${Number(i)+1})** ${userTag} :- \`$${money[i].data.toLocaleString()}\`\n` } const embed = new Discord.MessageEmbed() .setAuthor(`Global LeaderBoard`, client.user.displayAvatarURL({ dynamic: true })) .setTimestamp() .setColor('RANDOM') .setDescription(finalLb) message.channel.send(embed) }
额外优化建议
- 如果你用的是discord.js v13及以上版本,需要前往Discord开发者后台的机器人设置页,开启
Server Members Intent权限,才能正常拉取服务器成员数据到缓存 - 如果确实需要展示不在缓存的用户标签,可以调用
client.users.fetch(userId)异步拉取用户信息,注意要把命令处理逻辑改成async异步函数,拉取失败时依然走兜底逻辑
内容的提问来源于stack exchange,提问作者Tokioshy
相关产品推荐
相关产品推荐

