Discord.js userinfo命令报Cannot read property 'user' of undefined如何解决
问题定位与修复方案
1. 报错核心原因
你遇到的TypeError: Cannot read property 'user' of undefined错误由两个上下文调用错误直接导致:
- 你的
execute方法已经将message作为入参传入,但代码中所有相关调用都错误写为this.message,类实例的this对象上不存在message属性,this.message为undefined,访问它的任何属性都会抛出错误 - 代码中
if(this.member.user.id == message.guild.ownerID)这行错误将局部变量member写为this.member,this.member同样是undefined,访问它的user属性就是你遇到的直接报错点
2. 其他潜在问题修复
- 权限判断逻辑错误:原有
if(!permissions.length == 0)逻辑完全写反,正确应该是当权限列表为空时添加「无关键权限」提示 - 未定义
status映射对象:代码中使用status[member.user.presence.status]但未提前定义status变量,会抛出未定义错误 - 业务逻辑不一致:部分属性调用误用入参
message(比如创建时间取了触发命令的用户而非查询用户、页脚ID显示错误) - API调用错误:
displayAvatarURL是方法不是属性,需要加括号调用displayAvatarURL() - 发送格式兼容问题:新版discord.js要求embed用
embeds数组格式传递,避免后续升级报错
3. 修复后完整代码
const Discord = require('discord.js'); const moment = require('moment'); // 确保已安装moment库:npm i moment static description = 'Get information on a mentioned user.'; static usage = '<@user|id>'; static names = ['userinfo', 'ui']; static userPerms = []; static botPerms = []; // 提前定义状态映射 const status = { online: '在线', idle: '离开', dnd: '请勿打扰', offline: '离线' }; async execute(client, message) { var permissions = []; var acknowledgements = 'None'; const args = message.content.trim().split(/ +/g); const user = message.mentions.users.first() || message.author; const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]) || message.member; const randomColor = "#000000".replace(/0/g, function () { return (~~(Math.random() * 16)).toString(16); }); // 权限判断 if(message.member.hasPermission("KICK_MEMBERS")) permissions.push("Kick Members"); if(message.member.hasPermission("BAN_MEMBERS")) permissions.push("Ban Members"); if(message.member.hasPermission("ADMINISTRATOR")) permissions.push("Administrator"); if(message.member.hasPermission("MANAGE_MESSAGES")) permissions.push("Manage Messages"); if(message.member.hasPermission("MANAGE_CHANNELS")) permissions.push("Manage Channels"); if(message.member.hasPermission("MENTION_EVERYONE")) permissions.push("Mention Everyone"); if(message.member.hasPermission("MANAGE_NICKNAMES")) permissions.push("Manage Nicknames"); if(message.member.hasPermission("MANAGE_ROLES")) permissions.push("Manage Roles"); if(message.member.hasPermission("MANAGE_WEBHOOKS")) permissions.push("Manage Webhooks"); if(message.member.hasPermission("MANAGE_EMOJIS")) permissions.push("Manage Emojis"); // 修复权限为空的判断逻辑 if(permissions.length === 0){ permissions.push("No Key Permissions Found"); } // 修复this.member的错误调用 if(member.user.id == message.guild.ownerID){ acknowledgements = 'Server Owner'; } const embed = new Discord.MessageEmbed() .setDescription(`<@${member.user.id}>`) .setAuthor(`${member.user.tag}`, member.user.displayAvatarURL()) .setColor(randomColor) .setFooter(`ID: ${member.user.id}`) .setThumbnail(member.user.displayAvatarURL()) .setTimestamp() .addField("Status",`${status[member.user.presence.status]}`, true) .addField('Joined at: ',`${moment(member.joinedAt).format("dddd, MMMM Do YYYY, HH:mm:ss")}`, true) .addField("Created at: ",`${moment(member.user.createdAt).format("dddd, MMMM Do YYYY, HH:mm:ss")}`, true) .addField("Permissions: ", `${permissions.join(', ')}`, true) .addField(`Roles [${member.roles.cache.filter(r => r.id !== message.guild.id).map(roles => `\`${roles.name}\``).length}]`,`${member.roles.cache.filter(r => r.id !== message.guild.id).map(roles => `<@&${roles.id }>`).join(" **|** ") || "No Roles"}`, true) .addField("Acknowledgements: ", `${acknowledgements}`, true); // 兼容新旧版discord.js的embed发送格式 message.channel.send({ embeds: [embed] }).catch(err => message.channel.send({ embed: embed })); }
内容的提问来源于stack exchange,提问作者Th3-Dragon
相关产品推荐
相关产品推荐

