Discord.js排行榜用户排名显示异常问题求助
Discord.js机器人排行榜页脚排名错误修复
问题描述
基于Discord.js开发的机器人排行榜命令,希望在消息页脚展示当前用户的金币排名(即使不在前10),但实际页脚显示的是数据库内用户总数而非真实排名——比如执行命令的用户gonoahwhere实际排名第1,页脚却显示为3,而排行榜前10的描述区域显示正常。
错误原因
- 字段匹配错误:查找用户排名时,使用了
member.userId === id,但数据库模型中存储用户ID的字段是id,而非userId,导致无法正确定位对应用户的索引。 - 变量复用污染:生成前10排名时,复用了存储用户自身排名的
memberIdx变量,在map循环中每次对其自增,最终覆盖了原本的用户排名值,变成初始排名+10的结果。
修复后的代码
const { readdirSync } = require("fs"); const { EmbedBuilder, SlashCommandBuilder } = require("discord.js"); const config = require("../../config.json"); const botConf = require("../../config.js") const mongoose = require("mongoose"); const User = require("../../models/user"); module.exports = { data: new SlashCommandBuilder() .setName("leaderboard") .setDescription("Displays the richest across the Bot."), async execute(interaction) { let member = interaction.user; let memberData = await User.findOne({ id: member.id }) || new User({ _id: mongoose.Types.ObjectId(), id: member.id }) let { username, id } = interaction.user; let { coins } = memberData.wallet const memberCoins = (memberData) => { if (memberData < 1e3) return memberData; if (memberData >= 1e3 && memberData < 1e6) return (memberData / 1e3).toFixed(2) + "K"; if (memberData >= 1e6 && memberData < 1e9) return (memberData / 1e6).toFixed(2) + "M"; if (memberData >= 1e9 && memberData < 1e12) return (memberData / 1e9).toFixed(2) + "B"; if (memberData >= 1e12) return (memberData / 1e12).toFixed(2) + "T"; } let members = await User.find({ "wallet.coins": { $gt:0 } }).sort({ "wallet.coins":-1 }) if (!members) return console.log("Error: No members in database.") // 修复字段匹配错误,获取用户真实排名 let userRank = members.findIndex((member) => member.id === id) + 1 // 使用map自带的index生成前10排名,避免污染用户排名变量 let rank = members .slice(0, 10) .map((i, index) => `\`[${index + 1}]\` ∘ \`${interaction.client.users.cache.get(i.id)?.tag}\`: \`${memberCoins(i.wallet.coins)}\``) .join("\n") if (!members || members.length == 0) rank = "There are currently no members with coins!" let ranks = `You're ranked ${userRank} with ${memberCoins(memberData.wallet.coins) || 0} coins` if (!memberCoins(memberData.wallet.coins)) ranks = `You're unranked with 0 coins` let leaderboardEmbed = new EmbedBuilder() .setColor(botConf.embed.embedColor) .setAuthor({ name: "〔📜〕‒ NoahBoat Leaderboards" }) .setThumbnail(interaction.user.displayAvatarURL()) .setDescription(`∘∘∘ Here is the top 10 leaders for coins ∘∘∘\n\n${rank}`) .setFooter({ text: `${ranks}` }) .setTimestamp() await interaction.reply({ embeds: [leaderboardEmbed] }) }, };
修复说明
- 新增独立变量
userRank存储用户真实排名,修正findIndex的匹配条件为member.id === id,确保正确定位用户在排行榜中的位置。 - 生成前10排名时,利用
map方法自带的index参数生成序号,彻底避免变量复用导致的数值污染问题。
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

