You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:36:05