Discord.js+quick.db开发机器人 删除数组元素时误删整个数组如何解决
问题修复方案
问题根源
- 你调用
db.delete()的语法错误:quick.db的delete方法仅接收1个参数(要删除的存储键名),你传入的第二个参数'Temporary'不会被识别为数组内要删除的元素,因此会直接删除整个message.author.id对应的存储值,导致整个数组被清空。 - 插入
Temporary临时值的逻辑完全多余:你只是为了避免背包为空时调用includes()报错,完全可以通过给查询操作设置默认空数组的方式实现,不需要额外插入再删除临时值。
优化后完整代码
const db = require('quick.db'); const { MessageEmbed } = require('discord.js'); // 直接获取用户背包,为空时默认返回空数组,不需要临时值 const userItems = db.get(message.author.id) || []; console.log(userItems); if(args[0] === "Rod"){ // 语义化命名变量,提高可读性 const hasRod = userItems.includes('Rod'); if(hasRod){ return message.channel.send("You already have this item!"); } // 补充获取用户余额的逻辑,你原代码的money变量来源未声明 const userBalance = db.get(`${message.author.id}.balance`) || 0; if(userBalance < 15000){ return message.channel.send(`Insufficent Funds! You have ${userBalance} coins while the item you are trying to buy costs 15000 coins.`); } // 执行扣款+添加道具逻辑 db.subtract(`${message.author.id}.balance`, 15000); db.push(message.author.id, "Rod"); console.log("A User has purchased a Rod."); return message.channel.send("You have bought 1 Rod."); }
补充:后续删除数组指定元素的通用写法
如果你之后有删除背包内指定道具的需求,不要用delete方法,而是用「查询→过滤→重写」的逻辑实现:
// 示例:删除用户背包内的Rod const currentItems = db.get(message.author.id) || []; const updatedItems = currentItems.filter(item => item !== 'Rod'); db.set(message.author.id, updatedItems);
内容的提问来源于stack exchange,提问作者Bashar Zain
相关产品推荐
相关产品推荐

