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
相关产品推荐
相关产品推荐

