Search code examples
keystonejskeystone

KeystoneJS save() inside getUpdateHandler callback doesn't work


I have this code on API:

var data = (req.method == 'POST') ? req.body : req.query;
if (!data.betId || !data.userId) return res.apiError('wrong request payload');
BetUser.model.findOne({bet: data.betId, user: data.userId}).exec(function(err, bets){
    if (bets){

        return res.apiError('you placed the bet for this bet', bets);
    }
    var bet_item;
    item = new BetUser.model({bet: data.betId, user: data.userId});
    item.getUpdateHandler(req).process(data, function(err) {

        if (err) return res.apiError('error', err);
        Bet.model.findById(data.betId).exec(function(err, bet){
            if (err) return res.apiError('database error', err);

            switch(parseInt(item.betChoice)){
                case 0:
                    bet.drawTeamBets +=1;
                    break;
                case 1:
                    bet.firstTeamBets +=1;
                    break;
                case 2:
                    bet.secondTeamBets +=1;
                    break;
            };
            bet.drawTeamBets = 1000;
            console.log(bet);
            bet.save();
            console.log(bet);
            bet_item = bet;

        });
        User.model.findById(data.userId).exec(function(err, user){
            if (err) return res.apiError('database error', err);
            user.gold -= item.betAmount;
            user.save();

            res.apiResponse({
                bet_detail : item,
                user : user,
                bet : bet_item
                });

        });

    });
});

The thing is that the Bet object wasn't updated, those 2 console.log print the old object. How can i save the bet in this case? meanwhile the User object was updated. So strange.


Solution

  • I think you must define a function to be called after the save operation, there are two ways to do that, first one:

    bet.save(function (err, bet) {
      if (err){ console.log(err); }
      console.log('saved bet: ', bet);
      // place for other code after save operation..
    });
    

    Using returned Promise:

     bet.save().then(function (bet) {
          console.log('saved bet: ', bet);
          // place for other code after save operation..
        });
    

    for more details and examples: mongoosejs.com/docs/api.html#model_Model-save