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

Posted

技术标签:

【中文标题】Discord.js 错误:它正在删除整个数组。 Quick.db 和 discord.js【英文标题】:Discord.js err: It's deleting the entire array. Quick.db and discord.js 【发布时间】:2021-12-03 20:35:18 【问题描述】:

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

这是一个sn-p的代码。

变量是: 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的定义是什么?请也显示该代码 【参考方案1】:

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) 返回用户拥有的项目数组。您已经知道可以使用 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 中的数组中删除单个元素的问题,而在此之前的代码 sn-p 应该回答您关于如何最好地“优化”您的功能的问题。

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

【讨论】:

你看,“临时”存在的原因显然是因为 JavaScript 无法查看“Rod”是否在未定义中。让 a1 = items.includes('Rod'); ^ TypeError: Cannot read properties of undefined (reading 'includes') Temporary 只是必要的,因此代码可以检测它们是否是数组中的“Rod”。这个回复对我帮助很大,感谢您花时间教我 quick.db 和 JavaScript 的工作原理!我希望你有一个美好的生活,让它沉入其中!

以上是关于Discord.js 错误:它正在删除整个数组。 Quick.db 和 discord.js的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js,通过数组中的 ID 查找用户是不是具有角色

如何隐藏 DiscordAPIError (discord.js) (node.js)

如何从用户 discord.js v12 中删除所有角色?

Discord.js:推送到数组是组合字符串

discord.js 机器人正在删除所有消息

从 discord.js 中的数组中删除 args