discord.js v14 MongoDB等级系统异常:库中等级为0却返回1
问题排查与修复方案
1. 核心问题:获取数据时的条件判断错误
你在获取用户数据的代码中,所有if/else if条件使用的是赋值运算符=而非比较运算符===,这直接导致了level被强制修改为1:
- 执行
if (userdata.level = 0)时,会先把userdata.level赋值为0,由于0在布尔判断中是假值,代码会进入下一个else if分支 - 执行
else if (userdata.level = 1)时,把userdata.level赋值为1,此时1是真值,代码进入该分支,最终level被固定为1
修复代码:将所有条件中的=替换为===(严格相等):
if (userdata.level === 0) { hedef = 1000 kalan = parseInt(hedef) - parseInt(userdata.xp) } else if (userdata.level === 1) { hedef = 2000 kalan = parseInt(hedef) - parseInt(userdata.xp) } else if (userdata.level === 2) { hedef = 4000 kalan = parseInt(hedef) - parseInt(userdata.xp) } else if (userdata.level === 3) { hedef = 8000 kalan = parseInt(hedef) - parseInt(userdata.xp) } else if (userdata.level === 4) { hedef = 16000 kalan = parseInt(hedef) - parseInt(userdata.xp) } else if (userdata.level === 5) { hedef = '?' kalan = 'Yakında' }
2. XP升级逻辑顺序错误
给用户添加XP的代码中,level判断是从低到高排列的,导致当XP满足更高等级条件时(比如>=2000),会先触发>=1000的分支,无法升级到更高等级。
修复代码:将判断顺序改为从高到低:
if (userdata.xp >= 16000) userdata.level = 5 else if (userdata.xp >= 8000) userdata.level = 4 else if (userdata.xp >= 4000) userdata.level = 3 else if (userdata.xp >= 2000) userdata.level = 2 else if (userdata.xp >= 1000) userdata.level = 1 else userdata.level = 0
3. Schema字段类型隐患
Discord用户ID是64位字符串,你当前Schema中把discord_id设为Number类型,会导致精度丢失(JavaScript的Number最大精确值为2^53),可能出现查询匹配失败的问题。
修复代码:将discord_id类型改为String:
const user = new mongoose.Schema({ discord_id: { type: String, unique: true }, xp: Number, level: Number, });
内容的提问来源于stack exchange,提问作者Grkm
相关产品推荐
相关产品推荐

