You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:39:01