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

Discord.JS搭建服务器XP排行榜时代码运行异常问题

问题排查与修复方案

核心错误列表

  • 混淆了本地JSON文件和数据库模型的用法:你通过require('./member_stats.json')引入的是纯JSON格式的普通数据,没有Mongoose模型的find()、sort()、exec()等数据库操作方法,原有相关调用全部不生效。
  • 语法错误:变量声明let.embed = new MessageEmbed()多写了一个.,正确写法为let embed = new MessageEmbed()。
  • 方法调用逻辑错误:client.channels.cache.get()仅接收字符串类型的频道ID作为入参,你传入{serverID: message.guild.id}对象完全不符合规范,且该处本来是要读取用户统计数据,错误调用了频道缓存接口。
  • 未定义变量错误:排序参数[[userStats.level, 'descending']]中的userStats.level是未声明变量,排序JSON数组时直接使用属性名字符串即可。
  • 代码冗余错误:在!leaderboard命令判断分支外,重复粘贴了一遍排行榜生成代码,执行时会直接抛出res、embed变量未定义的错误。
  • API调用错误:discord.js v13及以上版本中,addFields仅接收对象数组作为参数,直接传两个字符串需要使用addField方法,或者将参数包装为{name: '参数1', value: '参数2'}格式传入addFields。

修复后完整代码

const allStats = require('./member_stats.json');
const { MessageEmbed } = require('discord.js');

if(command === '!leaderboard'){
  message.delete();
  if (message.channel.id === "876597275856601168"){
    // 过滤当前服务器数据,按等级降序排序
    const res = allStats.filter(item => item.serverID === message.guild.id)
      .sort((a, b) => b.level - a.level);

    const embed = new MessageEmbed()
      .setTitle("XP Leaderboard");

    if(res.length === 0){  //无结果
      embed.setColor("#FF0000");
      embed.addField("ERROR", "No data found!");
    } else if (res.length < 10){  //结果少于10条
      embed.setColor("#8F00FF");
      for(let i = 0; i < res.length; i++){
        let member = message.guild.members.cache.get(res[i].userid) || "Former Member";
        let username = member === "Former Member" ? member : member.user.username;
        embed.addField(`${i+1}. ${username}`, `Level: ${res[i].level}`);
      }
    } else{  //结果10条及以上
      embed.setColor("#8F00FF");
      for(let i = 0; i < 10; i++){
        let member = message.guild.members.cache.get(res[i].userid) || "Former Member";
        let username = member === "Former Member" ? member : member.user.username;
        embed.addField(`${i+1}. ${username}`, `Level: ${res[i].level}`);
      }
    }
    message.channel.send({embeds: [embed]});
  }
}

补充说明

如果你后续改用MongoDB存储数据,需要先定义对应的Mongoose模型替代直接引入JSON文件,原有find、sort的数据库操作逻辑才可以正常使用,排序参数需要改为sort({level: -1})即可。

内容的提问来源于stack exchange,提问作者Neo Söderberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:57:02