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
相关产品推荐
相关产品推荐

