Вносите изменения в mongodb, только если все подзапросы успешно выполняются в Promise.all () - PullRequest
0 голосов
/ 02 апреля 2020

Я хочу выполнить функцию, которая состоит из нескольких подзапросов, работающих в нескольких коллекциях. Затем они выполняются в 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)})
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...