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

Discord.js排行榜用户排名显示异常问题求助

Discord.js机器人排行榜页脚排名错误修复

问题描述

基于Discord.js开发的机器人排行榜命令,希望在消息页脚展示当前用户的金币排名(即使不在前10),但实际页脚显示的是数据库内用户总数而非真实排名——比如执行命令的用户gonoahwhere实际排名第1,页脚却显示为3,而排行榜前10的描述区域显示正常。

错误原因

  1. 字段匹配错误:查找用户排名时,使用了member.userId === id,但数据库模型中存储用户ID的字段是id,而非userId,导致无法正确定位对应用户的索引。
  2. 变量复用污染:生成前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:58:34