我正在更新一个基于node.js
、mongodb
和 ``mongoose`` 构建的财务应用程序,目前我面临着处理从系统中提取资金的逻辑的挑战。问题是,如果用户同时访问资金提取端点,则他们可以请求大于其余额的金额。例如,可用余额为 10 美元,用户可以同时处理多次 10 美元提款。
我知道问题出在哪里,只是我一直无法解决它。我知道这种情况正在发生,因为这些操作是同时发生的,所以user.balance
总是会发生,10
因为借记发生在读取之后。我对后端开发比较陌生,所以如果我没有使用正确的术语,请原谅我。这就是我的代码的样子。
try{
// Perform tasks such as validating the account number, etc.
const user = await User.findById(req.user._id);
if(user.balance < req.body.amount)
return res.status(400).send({message:"Insufficient Balance"});
// update the user balance in the DB to user.balance - req.body.amount
return res.status(200).send({message:"Fund has been sent to the account provided"})
}
我尝试了一种更新集合中的用户记录并使用该响应来检查用户余额的方法,但我不太确定这是否能完全解决我的问题,或者是否仍然存在漏洞,或者是否有更好的方法来处理这。
这是我尝试的第二种方法
try{
// Perform tasks such as validating the account number, etc.
const idx = uuid()
const user = await User.findByIdAndUpdate(req.user._id, {withdrawal_intent:idx} {
new: true,
});
if(user.balance < req.body.amount)
return res.status(400).send({message:"Insufficient Balance"});
// update the user balance in the DB to user.balance - req.body.amount
return res.status(200).send({message:"Fund has been sent to the account provided"})
}
我愿意重构代码以适应处理此问题的最佳方法
PS:这是一个旧的代码库,所以我可能使用猫鼬的旧语法。
"mongoose": "^5.9.9"