Le Duy Khanh
Le Duy Khanh

Reputation: 1369

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.

Upvotes: 0

Views: 983

Answers (2)

xes
xes

Reputation: 21

Try this...

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
            });

        });


    });

Nest your last mongoose query in the callback of the previous query. This will ensure the .save fires before the last query.

Upvotes: 0

Andrei Alexandru
Andrei Alexandru

Reputation: 89

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

Upvotes: 0

Related Questions