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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:54:23