Я хочу выполнить функцию, которая состоит из нескольких подзапросов, работающих в нескольких коллекциях. Затем они выполняются в Promise.all (). Проблема в том, что изменения, сделанные первым запросом, сохраняются в БД, даже если второй или третий запрос может быть неудачным (например, бонус равен нулю). Как я могу предотвратить это?
Некоторый контекст: Цель этой функции - отслеживать транзакции, в которых клиенты (которые набирают баллы в программе лояльности) набирают sh набранных баллов, чтобы получить выбранные бонус в обмен.
export const addNewBonus = (req,res) => {
let newBonus = new Bonus(req.body)
//save new Bonus into database
var f1 = newBonus.save()
//increment timesChosen for the selected bonus of the involved shop
var f2 = Shop.findOne({ "_id": req.body.shopId})
.then((shop) => {
const bonus = shop.bonuses.id(req.body.bonusId)
if(bonus == null) throw "Bonus with specified bonusID not found for this shop";
else bonus.timesChosen = bonus.timesChosen + 1
return shop.save()
})
//update user's points
var f3 = User.findOne({ "_id": req.body.userId})
.then((user) => {
const currentPointAmount = user.pAmount;
if(currentPointAmount < req.body.bonusPrice) throw "Not enough Points on user account to choose this bonus"
else{
user.pAmount = user.pAmount - req.body.bonusPrice
}
return user.save()
});
Promise.all([f1, f2, f3])
.then(results => {
res.send(results)
})
.catch( err => {res.send(err)})
}