执行.addmoney命令报TypeError: 期望数字却收到字符串,如何解决?
报错原因
- 你使用的数据库
add方法要求操作的目标字段存储值为数字类型,目前你数据库中存储的money_${用户id}对应值是字符串类型,同时你传入的增量参数args[1]本身也是用户输入的字符串类型,双重类型不匹配触发报错。 - 代码存在逻辑笔误:
if (args[0] > 10000)判断对象错误,args[0]是你传入的用户参数,你实际要判断的是金额参数args[1]是否超过上限。
修复方案
直接替换原有代码即可,兼容已有的字符串类型旧数据,同时修复逻辑错误:
const { db } = require("../../main"); // 补充你原代码缺失的MessageEmbed导入,否则后续会触发未定义报错 const { MessageEmbed } = require("discord.js"); module.exports = { name: "addmoney", category: "economy", description: "Adds Money to a user", usage: ".addmoney [user] <amount>", accessableby: "Administrator, Owner", run: async (bot, message, args) => { if (!message.member.hasPermission("ADMINISTRATOR", "MANAGE_GUILD")) return message.channel.send("You Do Not Have Permissions To Add Money... - [ADMINISTRATOR, MANAGE_GUILD]"); if (!args[0]) return message.channel.send("You forgot to mention a person") let user = message.mentions.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.channel.send("Enter A Valid User") if (!args[1]) return message.channel.send("I can not add an empty amount...") if (isNaN(args[1])) return message.channel.send(`Who taught you numbers? I really want to talk with that person`); // 转成数字再判断金额上限,修复原参数错误问题 const addAmount = Number(args[1]) if (addAmount > 10000) return message.channel.send("Have you even checked your balance yet? You are broke... Get a job first") // 兼容旧数据的数据库操作 let currentBal = await db.get(`money_${user.id}`) || 0 currentBal = Number(currentBal) const newBal = currentBal + addAmount await db.set(`money_${user.id}`, newBal) const bal = newBal let moneyEmbed = new MessageEmbed() .setColor('#00cbff') .setDescription(`Added ${args[1]} coins\n\nNew Balance: ${bal}`); message.channel.send(moneyEmbed) } }
修复说明
- 所有金额相关参数都统一转为数字类型,避免类型不匹配
- 读取现有余额后强制转数字,兼容之前已经存为字符串的旧用户数据
- 修复了金额上限判断的参数错误问题
- 补充了缺失的
MessageEmbed导入,避免后续出现未定义报错
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

