Node.js/Express接口if...else异常:钱包余额未扣除求助
以下是代码中导致余额未扣除的核心问题及修复建议:
KES分支中用户更新条件变量未定义
在currency == "KES"的代码块里,执行User.findOneAndUpdate({ email: email }, ...)时,email变量从未被声明或赋值。当前分支仅在创建交易记录时使用了req.body.email,但更新余额时误用了未定义的email,导致MongoDB查询不到目标用户,无法执行余额扣除操作。
修复:将查询条件改为{ email: req.body.email },或提前声明const email = req.body.email;。变量赋值顺序错误导致currency2未初始化
代码开头的var currency2 = currency;执行时,currency还未被赋值(var currency = req.body.currency;在这之后),因此currency2的值为undefined。这可能影响Flutterwave转账请求的合法性,即使转账成功,后续余额更新逻辑也会因前面的问题失效。
修复:调整赋值顺序,先获取currency再赋值给currency2,或直接使用req.body.currency替代currency2。else分支初始amount赋值错误
else分支开头直接将amount赋值为初始值为0的output_amount,导致调用汇率转换API时传入的amount为0,大概率无法触发responseJson.message == "Transfer amount fetched"的条件,后续的余额扣除和交易记录逻辑根本不会执行。
修复:用req.body.amount初始化amount,而非output_amount。混合async/await与then/catch导致错误丢失
代码同时使用await和.then/.catch,例如await fetch(...).then(...).then(...),这种写法容易让异步错误无法被外层try/catch捕获。比如.then内部的数据库操作错误可能被忽略,导致你看不到报错信息,误以为流程正常。
修复:统一使用async/await写法,移除.then链,所有异步操作用await包裹,错误由外层try/catch统一处理。未处理用户不存在的边界情况
执行const debit = await User.find({ email: req.body.email });后直接访问debit[0].balance,若用户不存在,debit[0]为undefined会抛出错误,但该错误可能被.catch捕获后仅打印日志,不会反馈给客户端,导致你无法及时发现问题。
修复:添加用户存在性判断:const user = await User.findOne({ email: req.body.email }); if (!user) { return res.status(404).json({ message: "用户不存在" }); } const debit_amt = user.balance - output_amount; await User.findOneAndUpdate({ email: req.body.email }, { $set: { balance: debit_amt } });交易记录保存未用await且错误处理不足
transactions.save()未使用await,意味着保存操作可能未完成就返回响应;若保存失败,错误仅被内部catch打印日志,不会通知客户端。
修复:改为await transactions.save();,并在错误时返回对应响应。
内容的提问来源于stack exchange,提问作者Pamela

