2017-02-23 68 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在最后一次查询之前触发。