如何在 discord.js 中使用 JSON 数据库制作排行榜
Posted
技术标签:
【中文标题】如何在 discord.js 中使用 JSON 数据库制作排行榜【英文标题】:How make a leaderboard with JSON database in discord.js 【发布时间】:2020-08-19 23:32:57 【问题描述】:我想在我的 discord 机器人中创建一个排行榜。
已经开始了,我创建了一个 JSON 经典数据库,只有 userID
和 Coins
列。
"3879720334874588161":"coins":5,"3919222756303420417":"coins":5
现在我会用这个数据库做一个排行榜,但是我有一些问题:
(node:15500) UnhandledPromiseRejectionWarning: TypeError: coins.sort is not a function
at Object.module.exports.run (c:\Users\StarKleey\Desktop\Bot discord\Bot Folletto\Commandes\list.js:9:9)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
warning.js:32
(node:15500) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
warning.js:32
(node:15500) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
而我的代码如下
const Discord = require("discord.js");
const fs = require('fs');
module.exports.run = async (client, message, args) =>
await message.delete();
let coins = JSON.parse(fs.readFileSync("./coins.json", "utf8"));
coins.sort([
['coins', 'descending']
]).exec((err, res) =>
if (err) console.log(err);
let embed = new Discord.MessageEmbed()
.setTitle("Coins Leaderboard")
//if there are no results
if (res.length === 0)
embed.setColor("RED");
embed.addField("No data found", "Please type in chat to gain coins!")
else if (res.length < 10)
//less than 10 results
embed.setColor("BLURPLE");
for (i = 0; i < res.length; i++)
let member = message.guild.members.get(res[i].userID) || "User Left"
if (member === "User Left")
embed.addField(`$i + 1. $member`, `**Coins**: $res[i].coins`);
else
embed.addField(`$i + 1. $member.user.username`, `**Coins**: $res[i].coins`);
else
//more than 10 results
embed.setColor("BLURPLE");
for (i = 0; i < 10; i++)
let member = message.guild.members.get(res[i].userID) || "User Left"
if (member === "User Left")
embed.addField(`$i + 1. $member`, `**Coins**: $res[i].coins`);
else
embed.addField(`$i + 1. $member.user.username`, `**Coins**: $res[i].coins`);
message.channel.send(embed);
)
module.exports.help =
name: "leaders"
有人可以解决我的问题或知道其他解决方案来制作排行榜吗?
【问题讨论】:
【参考方案1】:你的错误是coins.sort() is not a function
。
您的硬币变量是一个对象。如果您查看MDN / 另一个网站了解对象上可用的方法,您会发现没有可用的排序方法。
所以你试图调用一个不存在的函数,因此出现错误。
您当前存储用户和硬币的方式(不推荐)
如果您想使用当前文件对硬币对象进行排序,您可以使用
const sorted = [];
const keys = Object.keys(coins)
for (let user in coins)
const coin = coins[user].coins;
const entry = [keys[sorted.length]] : coins[user]
if (sorted.length === 0)
sorted.push(entry);
continue;
let i = 0;
while (sorted[i] !== undefined && sorted[i][Object.keys(sorted[i])].coins > coin)
i++;
sorted.splice(i, 0, entry)
JSFiddle Example
我存储用户然后排序的方式(推荐)
我建议用硬币保存你的用户:
[userID: "123", coins: 12, ]
那么你可以使用
betterCoins.sort((a,b)=>b.coins - a.coins);
JSFiddle Example
您也可以将对象转换为数组并使用推荐的方法,而无需更改文件的结构:
const newCoins = [];
for(let userObj in coins)
newCoins.push("name" : userObj, "coins": coins[userObj].coins )
【讨论】:
非常感谢!我马上就按你的方式做! 嘿,我回来问你是否有教程或文档来向我解释你的解决方案 @StarKleey 我不确定您不了解我的解决方案的哪些部分,如果您能提供更多背景信息,我可能会提供帮助。 我不明白你是如何保存数据的?它是在 json 上还是直接在 js 上?而且我不知道我的数据怎么能像你一样。以上是关于如何在 discord.js 中使用 JSON 数据库制作排行榜的主要内容,如果未能解决你的问题,请参考以下文章
我如何让我的机器人在 .JSON 文件 discord.js 中写入多行 [重复]
如何使用 Discord.js 显示 .JSON 文件的内容?
discord.js:我如何从 json 文件中获取随机项?