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 查找用户是不是具有角色