使用quick.db删除Discord Bot数组中单条数据而非整个数组的问题
解决quick.db删除数组单个条目而非整个数组的问题
你用db.delete()直接操作数组键的方式,会把整个item_${message.author.id}对应的所有数据删掉,这就是为什么整个数组消失了。要只删除数组里的单个条目,得先取出数组、过滤掉目标元素,再把处理后的数组存回数据库,具体实现如下:
修正后的完整代码
const db = require('quick.db'); // 补上缺失的require引入 const emote = require("../../config/emotes.json"); const { MessageEmbed } = require("discord.js"); module.exports = { name: 'delete', run: async(client, message, args) => { // 获取用户当前的物品数组,没有的话默认空数组 let userItems = db.get(`item_${message.author.id}`) || []; // 过滤掉要删除的'ThiefOutfit',得到新数组 userItems = userItems.filter(item => item !== 'ThiefOutfit'); // 根据新数组状态更新数据库:空数组则删除键,否则存新数组 if (userItems.length === 0) { db.delete(`item_${message.author.id}`); } else { db.set(`item_${message.author.id}`, userItems); } const embed = new MessageEmbed() .setDescription("你已删除盗贼套装"); // 可根据需求改成英文描述 message.channel.send(embed); } }
核心逻辑说明
- 获取数组:用
db.get()拿到用户的物品数组,加|| []是防止用户还没存过物品时返回null,导致后续filter方法报错 - 过滤元素:
filter()会生成一个不包含目标条目的新数组,相当于精准删除了指定条目 - 更新数据库:如果过滤后数组为空,直接删除对应的数据库键更合理;如果还有剩余元素,就把新数组存回去覆盖原数据
内容的提问来源于stack exchange,提问作者Levelmafia
相关产品推荐
相关产品推荐

