在getUpdateHandler回调中的KeystoneJS save()不起作用

时间:2017-02-23 02:55:25

标签: keystonejs keystone

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

        });

    });
});

问题是Bet对象没有更新,那两个console.log打印旧对象。 在这种情况下如何保存赌注?同时User对象已更新。太奇怪了。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

试试这个......

Bet.model.findById(data.betId).exec(function(err,bet){             if(错误)返回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
            });

        });


    });

将上一个mongoose查询嵌套在上一个查询的回调中。这将确保.save在最后一次查询之前触发。