使用discord.js与discord.js-commando开发机器人的嵌入消息报错问题
解决 Discord.js Commando 机器人嵌入消息的
username 未定义错误 这个错误的核心很明确:你代码里尝试读取一个未定义(undefined)对象的 username 属性,所以才抛出了 TypeError: Cannot read property 'username' of undefined。结合你说的「静态输出正常,加了动态逻辑就报错」,大概率是你动态获取的某个用户/成员对象没有正确拿到值。
我给你梳理几个排查和修复的方向:
1. 定位 .username 的使用位置
先在你的命令代码里搜所有出现 .username 的地方,常见的场景包括:
message.author.username(发送命令用户的用户名)targetMember.user.username(你动态获取的服务器成员用户名)- 从数据库/外部API拉取的用户数据的
.username
2. 检查动态对象是否存在
比如你如果是通过ID获取服务器成员,很可能因为ID无效、用户不在服务器里,导致获取到的对象是 undefined:
// 错误示例:没检查对象是否存在就直接用 const targetMember = message.guild.members.cache.get('无效的用户ID'); embed.setAuthor(targetMember.user.username); // targetMember是undefined,直接报错
修复方式:先做存在性检查
const targetMember = message.guild.members.cache.get('用户ID'); // 如果对象不存在,直接提示并终止命令 if (!targetMember) { return message.reply('找不到指定的用户,请检查ID是否正确!'); } // 确认存在后再使用属性 embed.setAuthor(targetMember.user.username);
3. 处理异步操作的结果
如果是用异步方法(比如 members.fetch())获取用户,一定要等Promise完成,并且处理可能的错误:
// 错误示例:没等异步操作完成就用结果 const targetMember = message.guild.members.fetch('用户ID'); embed.setAuthor(targetMember.user.username); // targetMember是Promise对象,不是成员对象 // 正确示例:用await等待+错误捕获 async run(message) { try { const targetMember = await message.guild.members.fetch('用户ID'); if (!targetMember) return message.reply('用户不存在'); embed.setAuthor(targetMember.user.username); message.channel.send({ embeds: [embed] }); } catch (err) { console.error('获取用户失败:', err); message.reply('获取用户信息时出错了'); } }
4. 避免混淆 message.author 和 message.member
如果你的命令支持私信使用,message.member 会是 undefined(因为私信没有服务器成员身份),这时候用 message.member.user.username 就会报错,应该改用 message.author.username。
5. 处理未捕获的Promise错误
你看到的 UnhandledPromiseRejectionWarning 是因为没有处理异步操作的错误,最好用 try/catch 包裹所有异步逻辑,避免警告出现。
完整修复示例
const { Command } = require('discord.js-commando'); const { MessageEmbed } = require('discord.js'); module.exports = class EmbedCommand extends Command { constructor(client) { super(client, { name: 'sendembed', group: 'util', memberName: 'sendembed', description: '发送带动态用户信息的嵌入消息', }); } async run(message) { try { // 假设这里是动态获取的用户ID(比如从命令参数里取) const targetUserId = message.args[0]; const targetMember = message.guild?.members.cache.get(targetUserId); if (!targetMember) { return message.reply('无法找到该用户,请确认用户ID正确且在服务器内'); } const embed = new MessageEmbed() .setTitle('动态嵌入消息') .setAuthor(`用户:${targetMember.user.username}`) .setColor('#00ff00'); await message.channel.send({ embeds: [embed] }); } catch (err) { console.error('命令执行出错:', err); message.reply('命令执行失败,请稍后再试'); } } };
内容的提问来源于stack exchange,提问作者zdxpulse
相关产品推荐
相关产品推荐

