2017-02-23 58 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 
       }); 

     }); 

    }); 
}); 

的事情是,輸入對象沒有更新,那些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.. 
}); 

使用返回承諾:

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

     }); 


    }); 

將最後一個mongoose查詢嵌套在前一個查詢的回調中。這將確保.save在最後一次查詢之前觸發。