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 作为存储系统的使用。
我对 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 作为存储系统的使用。