Discord.js 错误:它正在删除整个数组。 Quick.db 和 discord.js

Discord.js err: It's deleting the entire array. Quick.db and discord.js

我对 JavaScript 非常陌生,所以我决定通过创建一个 discord 机器人来给自己一个挑战。我想做的是检测用户是否拥有名为“Rod”的物品,如果有,机器人会回复“您已经拥有该物品!”否则,机器人会让用户购买商品。当我让它删除数组中的“临时”时,它会删除整个数组,我该如何解决这个问题?如果有任何方法可以解决这个问题并“优化”它,那就太棒了。

这是代码片段。

变量是: const db = require('quick.db'); const { MessageEmbed } = require('discord.js');

db.push(message.author.id, "Temporary") //This is so the .includes() function could work.
    let checkForItems = db.get(message.author.id)
    console.log(checkForItems);


            if(args[0] === "Rod"){

                //See if the user has "Rod" in their inventory
                let a1 = (checkForItems.includes('Rod'));
                console.log(help);

                if(a1 === false){

                    if (money.balance < 15000){
                        message.channel.send(`Insufficent Funds! You have ${money.balance} coins while the item you are trying to buy costs 15000 coins.`)
                    } else {

                        console.log("A User has purchased a Rod.")

                        let items = db.fetch(message.author.id, {items: [] } )

                        message.channel.send("You have bought 1 Rod.");
                        db.push(message.author.id, "Rod")
                    }
                } else {

                    message.channel.send("You already have this item!")

                }


            }
            db.delete(message.author.id, 'Temporary') //This is not working, how do I fix this? Its deleting the entire array.

方法db.delete(key)只接受一个参数,该参数是数据库中要从数据库中删除的键。因此,当您执行 db.delete(message.author.id) 时,您实际上是在删除键 message.author.id 中保存的内容,当然,这就是您的整个数组。

为了更好地了解正在发生的事情,我们假设您的数据库在 JSON 格式中看起来像这样:

{
  "userID1": ["Item 1", "Item 2", "Temporary"],
  "userID2": ["Item 6", "Item 9"]
}

现在,如果您这样做 db.delete(message.author.id),假设作者的 ID 是“userID1”,它将从数据库中删除整个“userID1”。您的数据现在将如下所示:

{
  "userID2": ["Item 6", "Item 9"]
}

显然,这就是导致整个数组被删除的原因。虽然 quick.db 有一个将项目推入数组的实用方法,但它没有任何类似的方便的方法来从数组中删除项目。为此,您需要做一些额外的工作。

但是,根据您的代码,我对您为什么需要这个“临时”字符串感到困惑。 let items = db.fetch(message.author.id, {items: [] } ) 行似乎表明您的数据库的实际结构是这样的:

{
    "userID1": {
        items: ["Item 1", "Item 2", "Item 9"]
    }
}

基于该结构,您根本不需要推送“临时”。事实上,这样做是没有意义的。如果我正确理解了您的数据库结构,那么 这就是我重写您的代码的方式:

let items = db.get(message.author.id, {items: []}).items;
console.log(items);
if(args[0] === "Rod"){
    //See if the user has "Rod" in their inventory
    let a1 = items.includes('Rod');

    if(!a1){
        if (money.balance < 15000){
            message.channel.send(`Insufficent Funds! You have ${money.balance} coins while the item you are trying to buy costs 15000 coins.`)
        } else {
            console.log("A User has purchased a Rod.")

            //Add "Rod" item to user's "items" array
            items.push("Rod");
            db.set(message.author.id + ".items", items);

            message.channel.send("You have bought 1 Rod.");
        }
    }
    else message.channel.send("You already have this item!");
}

我发现这是一个更简洁的解决方案。这应该会好得多。但是,我仍然想回答您原来的问题,即如何使用 quick.db.

从数组中删除项目

假设,对于这个例子,你的数据库结构看起来更像我在这个答案顶部显示的第一个,这样 db.get(message.author.id) returns 用户拥有的项目数组。您已经知道可以使用 db.push() 将项目添加到数组中。这是从数组中删除 "Temporary" 字符串的方法:

let items = db.get(message.author.id, []);
let index = items.indexOf("Temporary");

//If "Temporary" does not exist in the array, 'index' is -1
//We use Array.splice(index, elementsToRemove) to remove an item from the array
if (index > -1) items.splice(index, 1);

//Now we update the database with the newly modified array
db.set(message.author.id, items);

这应该可以回答您关于如何从 quick.db 中的数组中删除单个元素的问题,而这之前的代码片段应该可以回答您关于如何最好地“优化”您的功能的问题。

如果您愿意,我已经编写了一个名为 evg.js 的模块,它向 quick.db 添加了简单的实用方法(例如从数组中删除一个项目)。你可以找到它 here。您不需要直接使用我的模块,但您可以查看其代码以了解如何使用 quick.db 执行某些操作。那里的代码确实简化了我在以前的一些机器人中将 quick.db 作为存储系统的使用。