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

KeystoneJS save() inside getUpdateHandler callback doesn't work

我在 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 对象没有更新,那些 2 console.log 打印旧对象。 在这种情况下我该如何保存赌注?同时更新了用户对象。好奇怪。

我认为你必须定义一个在保存操作后调用的函数,有两种方法可以做到这一点,第一种:

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

试试这个...

Bet.model.findById(data.betId).exec(function(err, bet){ 如果(错误)returnres.apiError('database error',错误);

        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 在最后一个查询之前触发。