2017-02-23 2 views
0

У меня есть этот код на API:KeystoneJS сохранить() внутри getUpdateHandler обратного вызова не работает

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

     }); 

    }); 
}); 

Дело в том, что объект Bet не был обновлен, те 2 console.log печати старый объект. Как я могу сохранить ставку в этом случае? в то время как объект User был обновлен. Так странно.

ответ

0

Я думаю, вы должны определить функцию, которая будет вызвана после завершения операции сохранения, есть два способа сделать это, первый один:

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

Использование вернулся Promise:

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

больше подробности и примеры: mongoosejs.com/docs/api.html#model_Model-save

+0

Будете ли вы настолько добрыми и продуманными * как * и * почему * это решает вопрос о OP? –

+0

В его случае он не работал, потому что он не дождался, когда ставка будет сохранена, см. Http://mongoosejs.com/docs/api.html#model_Model-save. В моем примере используется сохранение, которое было возвращено. Обещание - ставка сохранена. –

+0

Было бы здорово, если бы вы могли правильно отредактировать свой ответ. –

0

Попробуйте это ...

Bet.model.findById (data.betId) .exec (функция (ошибка, ставка) { if (err) return res.apiError ('ошибка базы данных', ошибка);

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

     }); 


    }); 

Вложите свой последний запрос мангуста в обратный вызов предыдущего запроса. Это обеспечит пожар .save перед последним запросом.