Discord.js MongoDB排行榜同分功能实现遇points未定义错误
问题分析与解决
错误根源
你遇到的TypeError: Cannot read properties of undefined (reading 'points')来自三个核心问题:
- 索引越界:循环首次执行(
i=0)时,members[i-1]等价于members[-1],属于不存在的undefined值,直接访问其points属性必然报错。 - 未校验成员存在性:若数据库中不足10条数据,
members[i]会是undefined,直接访问members[i].points触发错误。 - 变量定义逻辑错误:你在循环外定义
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
相关产品推荐
相关产品推荐

