You need to enable JavaScript to run this app. Discord.js 开发match配对命令时user3.username出现undefined报错
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js 开发match配对命令时user3.username出现undefined报错

报错根因

Cannot read property 'username' of undefined 是两个问题叠加导致的:

  1. 提及用户的数组索引用错。JS数组是0起始索引,message.mentions.users.array() 返回的列表里,第一个提及对应用索引0、第二个对应索引1,代码中写的array()[2]永远取不到第二个提及的用户,自然返回undefined
  2. 原代码里写的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 13:24:04