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

Discord.js MongoDB排行榜同分功能实现遇points未定义错误

问题分析与解决

错误根源

你遇到的TypeError: Cannot read properties of undefined (reading 'points')来自三个核心问题:

  1. 索引越界:循环首次执行(i=0)时,members[i-1]等价于members[-1],属于不存在的undefined值,直接访问其points属性必然报错。
  2. 未校验成员存在性:若数据库中不足10条数据,members[i]会是undefined,直接访问members[i].points触发错误。
  3. 变量定义逻辑错误:你在循环外定义points时,i尚未声明,且赋值错误写成members.points(应为members[i].points),完全起不到预期作用。

同分共享排名的正确实现方案

要实现共享排名,需要跟踪上一名用户的分数和当前有效排名,当当前用户分数与上一名相同时,复用相同排名并标注“Shared”。以下是修正后的完整代码:

const {SlashCommandBuilder, EmbedBuilder} = require('discord.js');
const leaderboardModel = require('../../models/2023');

module.exports = {
    data: new SlashCommandBuilder()
        .setName("seasonleaderboard")
        .setDescription("Shows the top 10 players on the leaderboard for current season")
        .setDMPermission(false),
    async execute(interaction) {
        const members = await leaderboardModel
            .find({})
            .sort({points: -1})
            .catch(err => console.log(err));

        const embed = new EmbedBuilder().setTitle("GVFL 2023 Leaderboard").setColor("Yellow");
        let leaderboard = "";
        let previousPoints = null;
        let currentRank = 1;

        for (let i = 0; i < 10; i++) {
            // 先检查当前成员是否存在,避免undefined报错
            if (!members[i]) break;

            const member = members[i];
            const user = await interaction.client.users.fetch(member.userID);
            
            // 处理排名逻辑
            if (i === 0) {
                // 第一名直接显示排名1
                leaderboard += `${currentRank}. ${user.username} - ${member.points} points\n`;
                previousPoints = member.points;
            } else {
                if (member.points === previousPoints) {
                    // 分数相同,共享上一名的排名
                    leaderboard += `Shared ${currentRank}. ${user.username} - ${member.points} points\n`;
                } else {
                    // 分数不同,更新排名为当前索引+1
                    currentRank = i + 1;
                    leaderboard += `${currentRank}. ${user.username} - ${member.points} points\n`;
                    previousPoints = member.points;
                }
            }
        }

        embed.setDescription(leaderboard || "No players on the leaderboard yet!");
        return await interaction.reply({embeds: [embed]});
    }
}

关键改进说明

  • 边界校验:每次循环先判断members[i]是否存在,避免访问undefined属性。
  • 状态跟踪:用previousPoints记录上一名的分数,currentRank记录当前有效排名,同分时复用排名。
  • 初始情况处理:单独处理第一名逻辑,避免和不存在的上一名比较。
  • 空列表兼容:如果排行榜为空,显示提示文本,避免嵌入内容为空。

内容的提问来源于stack exchange,提问作者Samuli Kuusisto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:41:46