关于Quick.db模块的疑问:能否实现内容扣除功能?附代码
解决Quick.db扣除操作的问题
嘿,我瞅了你的代码,发现几个关键问题导致扣除功能没正常工作,咱们一个个来捋清楚:
1. 参数判断逻辑完全搞反了
你现在写的if (args[0]) return message.channel.send(...),意思是用户输入了物品名称反而返回错误提示,这完全和你想要的逻辑相反!应该改成判断用户没输入的情况:
if (!args[0]) return message.channel.send(`${message.author}, 你需要输入一个物品名称!`)
2. Quick.db subtract的用法误区
subtract是专门用来扣除数值类型数据的(比如物品数量),如果你的envan字段是用来存物品列表(字符串/数组),那subtract根本不适用:
- 如果是存物品数量:你得把键名改成
${user.id}.envan.${args[0]},这样每个物品单独存数量,方便扣除 - 如果是存物品列表(数组):应该用
pull方法来移除指定物品,比如await db.pull(${user.id}.envan, args[0])
3. Discord.js版本兼容性问题
你用的RichEmbed在Discord.js v12及以上版本已经被弃用了,换成MessageEmbed才能正常创建嵌入消息:
let embed = new Discord.MessageEmbed()
4. 异步操作的顺序问题
db.subtract和db.fetch都是异步操作,最好都加上await确保操作完成后再执行下一步,避免获取到旧数据。
修正后的完整代码
const db = require('quick.db') const Discord = require('discord.js') exports.run = async (client, message, args, config) => { // 先判断权限,提前返回更简洁 if(message.author.id !== 'My ID'){ return message.channel.send('你没有权限,兄弟').then(msg => { setTimeout(() => msg.delete(), 2500); }) } // 检查是否输入物品名称 if (!args[0]) return message.channel.send(`${message.author}, 你需要输入一个物品名称!`) let user = message.mentions.members.first() || message.author // 初始化物品数量(如果不存在就设为0,避免出现NaN) await db.add(`${user.id}.envan.${args[0]}`, 0) // 扣除1个物品(如果要支持自定义数量,可以改成args[1],记得判断是否是数字) await db.subtract(`${user.id}.envan.${args[0]}`, 1) // 获取更新后的物品数量(用get替代fetch,Quick.db新版推荐用法) let itemCount = await db.get(`${user.id}.envan.${args[0]}`) // 创建嵌入消息 let embed = new Discord.MessageEmbed() .setAuthor(`你的物品已被扣除!`, message.author.displayAvatarURL({ dynamic: true })) .addField(`扣除的物品:`, args[0]) .addField(`剩余数量:`, itemCount) .setColor("RED") .setTimestamp() message.channel.send(embed) }
额外补充:如果你的需求是从物品列表里移除某个物品(而不是扣数量),把相关操作改成这样就行:
// 从数组里移除指定物品 await db.pull(`${user.id}.envan`, args[0]) // 获取更新后的列表 let itemList = await db.get(`${user.id}.envan`)
内容的提问来源于stack exchange,提问作者Cosmos
相关产品推荐
相关产品推荐

