Discord.js 开发match配对命令时user3.username出现undefined报错
报错根因
Cannot read property 'username' of undefined 是两个问题叠加导致的:
- 提及用户的数组索引用错。JS数组是0起始索引,
message.mentions.users.array()返回的列表里,第一个提及对应用索引0、第二个对应索引1,代码中写的array()[2]永远取不到第二个提及的用户,自然返回undefined - 原代码里写的
let (!args[1]) = "Please mention a user."是完全不符合JS语法的无效代码,根本不会执行,导致前置校验完全失效
原代码逻辑偏差
没有按照场景拆分配对分支,默认逻辑不管几个提及都先取第一个用户+作者兜底,导致提及两个用户的时候,没有正确把第二个被提及的用户纳入配对范围。
修正后可运行代码
module.exports = { name: 'match', description: "随机计算两位用户的配对契合度", execute(message, args){ const Discord = require('discord.js'); const PREFIX = 'ly?'; // 校验命令触发条件 if (!message.content.startsWith(PREFIX + 'match')) return; // 获取所有提及的用户,过滤掉机器人自身的无效提及 const mentionedUsers = message.mentions.users.filter(user => !user.bot); const matchReplies = [ "5% Compatible!", "3% Compatible!", "10% Compatible!", "14% Compatible!", "17% Compatible!", "20% Compatible!", "22% Compatible!", "25% Compatible!", "24% Compatible!", "27% Compatible!", "32% Compatible!", "36% Compatible!", "34% Compatible!", "39% Compatible!", "42% Compatible!", "45% Compatible!", "47% Compatible!", "51% Compatible!", "54% Compatible!", "56% Compatible!", "59% Compatible!", "58% Compatible!", "60% Compatible!", "63% Compatible!", "65% Compatible!", "64% Compatible!", "68% Compatible!", "70% Compatible!", "74% Compatible!", "78% Compatible!", "79% Compatible!", "80% Compatible!", "83% Compatible!", "86% Compatible!", "84% Compatible!", "89% Compatible!", "91% Compatible!", "93% Compatible!", "95% Compatible!", "97% Compatible!", "98% Compatible!", "99% Compatible!", "100% Compatible!", "destined to get married." ]; const randomResult = Math.floor(Math.random() * matchReplies.length); // 分支1:无有效用户提及 if (mentionedUsers.size === 0) { return message.channel.send("使用该命令需要至少@一位用户哦"); } // 按场景定义配对双方 let pairUserA, pairUserB; // 分支2:仅提及1位用户,配对发起者和被提及用户 if (mentionedUsers.size === 1) { pairUserA = message.author; pairUserB = mentionedUsers.first(); } // 分支3:提及2位及以上用户,配对前两个被提及的用户 else { pairUserA = mentionedUsers.at(0); pairUserB = mentionedUsers.at(1); } // 统一生成结果Embed,避免重复代码 const matchEmbed = new Discord.MessageEmbed() .setTitle(`Does ${pairUserA.username} and ${pairUserB.username} match?`) .setDescription(`${pairUserA.username} and ${pairUserB.username} are __**${matchReplies[randomResult]}**__`) .setThumbnail('https://i.imgur.com/HywjPEB.png') .setColor(0x7732a8); return message.channel.send(matchEmbed); } }
关键适配逻辑
- 所有分支完全匹配需求规则:
- 命令执行后如果没有任何有效用户提及,直接返回提示要求用户@对象
- 仅提及1位用户时,自动把命令发起者和该被提及用户作为配对双方
- 提及2位及以上用户时,取最先@的两个用户作为配对双方
- 统一生成配对结果的Embed模板,去掉冗余的重复代码块
- 增加机器人账号的提及过滤,避免用户@机器人时生成无意义的配对结果
内容的提问来源于stack exchange,提问作者neon
相关产品推荐
相关产品推荐

