如何在quick.db中检查指定元素是否存在?Discord游戏机器人开发问题
你使用的db.has方法作用是检查数据库中是否存在指定键名,仅接收1个键名参数,完全不支持判断数组内的元素是否存在,这是你之前所有写法失效的核心原因。
你用db.push存储用户角色,所以troop_${message.author.id}对应的值是数组类型,要判断角色是否重复需要先拉取整个数组再做校验:
正确校验逻辑
- 先拉取用户已拥有的角色列表,没有数据时默认赋值空数组避免报错
const userTroopList = await db.fetch(`troop_${message.author.id}`) || []
- 用数组原生方法判断随机角色是否已存在
const has = userTroopList.includes(nada)
额外优化说明
你现有代码里的db.add、db.push等数据库操作都是异步逻辑,没有加await可能会出现数据写入失败、读写顺序错乱的问题,建议所有数据库操作都加上等待。
修正后完整代码示例
// 先做重复校验 const userTroopList = await db.fetch(`troop_${message.author.id}`) || [] const has = userTroopList.includes(nada) if(has === true){ console.log(has) let embed = new discord.MessageEmbed() .setTitle('Chest Opening | Clash Chest') .setDescription(`<@${message.author.id}> got:\n${amount} :coin:`) .setColor('RANDOM') .setFooter('Created by Tahmid GS#1867') message.channel.send(embed) await db.add(`coin_${message.author.id}`, amount) } else { console.log(has) await db.push(`troop_${message.author.id}`, nada) let embed = new discord.MessageEmbed() .setTitle('Chest Opening | Clash Chest') .setDescription(`<@${message.author.id}> got:\n${amount} :coin:\n||Common: ${nada}||`) .setColor('RANDOM') .setFooter('Created by Tahmid GS#1867') message.channel.send(embed) await db.add(`coin_${message.author.id}`, amount) await db.add(`card_${message.author.id}`, 1) }
内容的提问来源于stack exchange,提问作者Tahmid GS
相关产品推荐
相关产品推荐

