我正在使用express.recently维护节点服务器,当用户请求购买一件商品时,我有时会遇到处理用户购买的虚拟产品的问题(在客户端同时点击两次购买按钮)客户端同时没有这种行为的约束。下面的代码显示了如何重现它:
'buyItem': async (req, res, next) => {
const itemId = req.params.itemId;
const userId = req.headers['current-user-id'];
const orderRecord = await Order.find(itemId, userId)//do mongodb search
if (orderRecord && orderRecord.status === 'paid') {//second request detect no orderRecord exists beacase first request haven't create order yet
return res.status(400).json({
'code': 101,
'message': 'you have already bought it',
'result': {}
})
}
// fisrt request goes here
const orderNew = await Order.create(itemId, userId)//do mongodb create
await User.deduct(userId, item.price);
}
当第一个请求到来时,orderRcord不存在于db中,因此它将运行if()判断下面的代码。当第二次出现时,它仍然运行if()判断下面的代码,因为拳头请求还没有创建顺序。顺便说一句,我使用节点的集群进行多个cpus。 我该如何正确处理?谢谢你的帮助。