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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:05:23