Discord.js头像斜杠命令触发TypeError: Cannot read property 'users' of undefined
问题原因
你触发报错的核心原因是目标用户不在client.users.cache的缓存列表中,导致client.users.cache.find(user => user.id === avatarUser.id)返回undefined,后续调用undefined.tag就会抛出属性读取错误。
同时你的代码存在冗余操作:interaction.options.getUser('user')返回的本身就是完整的Discord User对象,根本不需要额外去缓存中二次查询匹配。
修复方案
直接删除多余的缓存查询代码,直接使用你已经拿到的avatarUser对象即可,interaction.options.getUser是同步方法不需要加await,修复后代码如下:
const Discord = require('discord.js') module.exports = { name: 'avatar', execute: async (interaction, client) => { // 直接获取目标用户,不需要后续二次查缓存 const avatarUser = interaction.options.getUser('user') || interaction.user const name = avatarUser.tag const avatar = avatarUser.displayAvatarURL({ dynamic: true }) const png = avatarUser.displayAvatarURL({ format: 'png' }) const jpg = avatarUser.displayAvatarURL({ format: 'jpg' }) const gif = avatarUser.displayAvatarURL({ format: 'gif' }) // 如果你使用的是discord.js v14及以上版本,需要把MessageEmbed替换为EmbedBuilder const embed = new Discord.MessageEmbed() .setTitle(`${name}'s Avatar`) .addFields( { name: 'Type', value: `[PNG](${png}) [JPG](${jpg}) [GIF](${gif})` } ) .setImage(avatar) .setColor('BLUE') interaction.reply({ embeds: [embed] }) } }
可选兜底方案
如果有特殊场景必须从客户端缓存取用户,可以加fetch兜底逻辑,避免缓存不存在的问题,同时缓存查询可以用性能更高的get方法替代find遍历:
// 缓存查找失败时主动拉取用户信息 const user = client.users.cache.get(avatarUser.id) || await client.users.fetch(avatarUser.id)
内容的提问来源于stack exchange,提问作者TDGPlayz
相关产品推荐
相关产品推荐

