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

Discord.JS命令参数异常:执行!stats提示cannot read property 'username' of undefined

错误根因

你的报错来源于两处核心逻辑错误:

  • 你通过split(' ')拆分得到的args是纯字符串数组,args[0]是形如<@!用户ID>的提及字符串,不是Discord.js的用户对象,本身不存在id属性,因此你给userMentioned赋的args[0].id本身就是undefined。
  • 就算你正确拿到了用户ID,你给userMentioned赋值的是ID字符串,字符串类型不存在user、userStats这类自定义属性,后续访问userMentioned.user.username自然会因为userMentioned.user为undefined抛出对应报错。

其他可优化问题

  • 你重复调用了message.delete():第一次在判断args.length时就删除了触发消息,第二次在setTimeout中尝试删除已经不存在的消息,会额外抛出报错。
  • 频道判断的代码块多写了一层大括号,属于语法冗余。

修正后代码

你应该从消息的提及集合中获取被@的用户,而不是从拆分的参数中直接取:

const args = message.content.trim().split(' ');
const command = args.shift().toLowerCase();

if(command === '!stats'){
  let userMentioned;
  // 从提及集合中获取被@的用户,没有的话取消息发送者
  if (message.mentions.users.size > 0) {
    userMentioned = message.mentions.users.first();
  } else {
    userMentioned = message.author;
  }
  // 只删一次触发消息,加catch避免异常
  message.delete().catch(err => console.log('消息删除失败', err));

  if (message.channel.id === "876597275856601168") {
    setTimeout(function (){
      const statsEmbed = new MessageEmbed()
      .setColor('#8F00FF')
      // 直接使用userMentioned的属性,不需要额外加.user
      .setAuthor(userMentioned.username, userMentioned.displayAvatarURL())
      .addFields(
          { name: '<:logoas2:876840515465797632>Current Level:', value: 'Current: **' + (userMentioned.userStats.level) + '**', inline: true },
          { name: '<:xp2:874732251571707966>Current XP:', value: 'Amount: **' + userMentioned.userStats.xp + '**', inline: true },
          { name: '<:xp3:876841199456092161>To Next Level:', value: 'Amount: **' + (userMentioned.xpToNextLevel - userMentioned.userStats.xp) + '**', inline: true },
          { name: '<:etherite:874730607106748457>Etherite:', value: 'Amount: **' + userMentioned.userStats.etherite + '**', inline: true },
          { name: '<:time:876866100774707290>Member Since:', value: 'Date: **' + userMentioned.userStats.dateofJoin + '**', inline: true },
      )
      .setTimestamp()
      .setFooter('Avesong', client.user.displayAvatarURL());
      client.channels.cache.get("876597275856601168").send({ embeds: [statsEmbed] });
    }, 500); 
  }
}

如果你的userStats是绑定在服务器成员GuildMember对象上而非全局User对象上,把message.mentions.users.first()换成message.mentions.members.first(),message.author换成message.member即可。


内容的提问来源于stack exchange,提问作者Neo Söderberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:18:02