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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:42:50