Quick.db .add函数运行异常 数值拼接而非算术求和问题
故障表现
Discord经济机器人addmoney加款指令逻辑异常:用户原有余额为100时,执行加款100操作后预期余额为200,实际返回结果为100100,呈现字符串拼接效果而非数值相加。
根因分析
- 命令参数默认类型问题:Discord.js传入的
args数组所有元素均为字符串类型,直接将字符串类型的金额参数传入QuickDB的add()方法时,会触发隐式类型转换,将原有数值余额转为字符串后执行拼接操作,最终得到拼接后的错误结果。 - 代码存在额外笔误/逻辑错误:
- 金额上限校验对象错误:当前代码判断
args[0] > 10000,但args[0]是用户标识参数,并非要添加的金额参数,校验完全不生效 - 拼写错误:获取用户逻辑中
messsage多写了一个s,message.guild.member.cache中member应为复数形式members,会触发运行时报错
- 金额上限校验对象错误:当前代码判断
修复后代码
const { QuickDB } = require('quick.db'); const db = new QuickDB(); const discord = require("discord.js") module.exports.run = async (bot, message, args) => { if (!message.member.permissions.has("ADMINISTRATOR")) return message.reply("You do not have the permissions to use this command😔.") if (!args[0]) return message.reply("Please specify a user❗") // 修正原有拼写错误 let user = message.channel.members.first() || message.guild.members.cache.get(args[0]) || message.guild.members.cache.find(r => r.user.username.toLowerCase() === args[0].toLocaleLowerCase()) || message.guild.members.cache.find(r => r.displayName.toLowerCase() === args[0].toLocaleLowerCase()) if (!user) return message.reply("Enter a valid user⛔.") if (!args[1]) return message.reply("Please specify the amount of money💰.") // 将金额参数转为数值类型 const addAmount = Number(args[1]) var embed = new discord.MessageEmbed() .setColor("#C06C84") .setAuthor(message.author.tag, message.author.displayAvatarURL({dynamic: true})) .setDescription(`Cannot give that much money⛔. Please specify a number under 10000💸.`) .setTimestamp() if (isNaN(addAmount) ) return message.reply("Your amount is not a number❗.") // 修正金额上限校验对象 if (addAmount > 10000) return message.reply({embeds: [embed]}) // 传入数值类型的金额执行累加 await db.add(`money_${user.id}`, addAmount) let bal = await db.get(`money_${user.id}`) let moneyEmbed = new discord.MessageEmbed() .setColor("#C06C84") .setDescription(`Gave $${addAmount} \n\nNew Balance: ${bal}`) message.reply({embeds: [moneyEmbed]}) } module.exports.help = { name: "addmoney", category: "economy", description: 'Adds money!', }
修复说明
- 新增
addAmount变量,通过Number()方法将字符串类型的金额参数转为数值类型,从根源避免字符串拼接问题 - 修正所有拼写错误,避免运行时找不到对象的报错
- 将金额合法性校验、上限校验、数据库累加操作的入参全部替换为转好类型的
addAmount,保证逻辑一致
内容的提问来源于stack exchange,提问作者stixyyST5
相关产品推荐
相关产品推荐

