Discord.js实现用户信息命令时出现users属性未定义报错
报错根因与修正方案
报错触发逻辑
报错信息
TypeError: Cannot read property 'users' of undefined的直接触发点为代码中的const user = message.mentions.users.first() || message.author行:执行到这行时,message.mentions对象本身为undefined,才会出现读取其下users属性失败的问题。该问题完全由代码适配的discord.js版本过旧导致,和你后续排查的结论一致。
核心过时API对应问题
- 代码中使用的
Discord.RichEmbed是discord.js v12及更早版本的内置类,从v13版本开始该类被重命名为MessageEmbed,当前最新稳定版v14已彻底移除RichEmbed的全局定义,类缺失会连带导致bot事件加载逻辑异常,最终出现mentions对象为空的情况。 - 旧版属性
user.presence.game已被完全移除,新版discord.js中用户的活动数据存储在user.presence.activities数组中,不存在game字段。 - 旧版可直接遍历的
member.roles集合,在新版中被封装为RoleManager结构,必须通过member.roles.cache才能获取角色集合做映射拼接。 - 新版discord.js要求主动开启对应权限意图:如果没有配置启用
MessageContent、GuildMembers、GuildPresences这三个核心意图,就算API写法完全匹配版本,也会出现message.mentions为undefined、成员角色获取失败、用户状态读不到的问题。
适配discord.js v14的修正参考代码
const { MessageEmbed } = require('discord.js'); // 导入正确的Embed类 module.exports.run = async (bot, message, args) => { const user = message.mentions.users.first() || message.author; const member = message.mentions.members.first() || message.member; const embed = new MessageEmbed() .setAuthor({ name: user.tag }) .setDescription("用户信息") .setColor("#64FF00") .addField("完整用户名:", user.tag, true) .addField("ID:", user.id, true) .addField("账号创建时间:", user.createdAt.toLocaleString(), true) .addField("当前状态:", user.presence?.status ?? 'offline', true) .addField("正在进行的活动:", user.presence?.activities?.[0]?.name ?? '无', true) .addField("拥有角色", member.roles.cache.map(r => `${r}`).join(' | '), true); message.channel.send({ embeds: [embed] }); }
内容的提问来源于stack exchange,提问作者Mathu_lmn
相关产品推荐
相关产品推荐

