自动等级升级系统条件判断失效导致误升级问题求助
问题根因
你的升级逻辑失效是两个语法/逻辑错误直接导致的:
- 条件判断误用逗号运算符:JS中
(表达式1, 表达式2)会依次执行两个表达式,最终返回最后一个表达式的结果。你写的if (profileData.exp >= 500, profileData.level = 1),后半段是赋值操作profileData.level = 1,这个表达式的返回值永远是1(转布尔值为true),所以不管用户当前经验、等级是多少,这个if判断永远成立。 - 相等判断写成了赋值:判断两个值相等必须用
===(严格相等,推荐)或==,单个=是赋值操作——你每次进判断都会强行把用户等级改成1,自然会出现无限连续升级、经验扣成负数的问题。 - 后续补的
else if (profileData.exp <= 500){continue;}完全无效:前面的if永远成立,根本走不到else分支;而且如果这段逻辑不在循环体内,continue会直接抛出语法错误。
修复方案
基础版(仅实现1级升2级逻辑)
核心是把条件判断改成逻辑与&&连接两个严格判断,同时把升级前置条件写入数据库查询语句,避免并发场景下的重复升级问题:
// 两个条件同时满足才会进入升级分支:经验>=500、当前等级严格等于1 if (profileData.exp >= 500 && profileData.level === 1) { const response = await profileModel.findOneAndUpdate( { userID: message.author.id, level: 1, // 数据库层面校验当前等级,防止并发下重复升级 exp: { $gte: 500 } // 数据库层面校验经验值,避免扣成负数 }, { $inc: { exp: -500, level: 1, bank: 500, }, } ); // 只有更新成功(确实满足升级条件)才发送提示 if (response) { return message.channel.send(`${message.author.username}, 已升级到2级,银行账户收到500金币`); } }
可扩展版(支持多级升级配置)
后续新增等级不需要重复写if判断,只需要修改规则配置即可:
// 升级规则配置,从低到高排列,新增等级直接往数组里加条目 const levelRules = [ { targetLevel: 2, requireLevel: 1, requireExp: 500, rewardGold: 500 }, { targetLevel: 3, requireLevel: 2, requireExp: 1200, rewardGold: 1200 }, { targetLevel: 4, requireLevel: 3, requireExp: 2500, rewardGold: 3000 }, // 更多等级规则在此补充 ]; // 遍历规则匹配可触发的升级 for (const rule of levelRules) { if (profileData.level === rule.requireLevel && profileData.exp >= rule.requireExp) { const updateRes = await profileModel.findOneAndUpdate( { userID: message.author.id, level: rule.requireLevel, exp: { $gte: rule.requireExp } }, { $inc: { exp: -rule.requireExp, level: 1, bank: rule.rewardGold } } ); if (updateRes) { message.channel.send(`${message.author.username}, 已升级到${rule.targetLevel}级,银行账户收到${rule.rewardGold}金币`); // 如果需要支持攒够经验连续升多级,删掉下面的break,升级后重新拉取用户数据再循环判断即可 break; } } }
注意事项
- 永远不要在if条件判断里写赋值语句,值相等判断固定用
===,多条件同时满足用&&连接,不要用逗号代替。 - 涉及资产、等级这类核心数据更新,一定要把前置校验条件写进数据库查询参数里,不能只靠代码层的if判断,否则并发请求下很容易出现数据错乱。
内容的提问来源于stack exchange,提问作者KazTeko
相关产品推荐
相关产品推荐

