如何在 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 经典数据库,只有 userIDCoins 列。

"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 文件的内容?

如何将 JSON 数据嵌入到 discord.js 中

discord.js:我如何从 json 文件中获取随机项?

如何从 json 响应中连接来自不同对象数组的值? Node.js、Discord.js

Discord.js 备份 json 文件