使用Mongoose和Node.js在同一时间请求数据覆盖

时间:2015-11-19 21:23:14

标签: javascript node.js mongodb

我的MEAN.js应用程序出现以下问题。我正在尝试制作一些网络浏览器游戏。玩家正计划攻击野蛮人的城堡,必须对攻击进行评估,所以我为AttackSchema做了一个方法,负责这个。每次用户登录或查看军队移动窗口时都会调用此方法(将来我也想为此添加一个cron)。问题在于,当我计划在同一个野蛮城堡进行2次攻击时,在两次攻击后进行登出和登录评估,它会覆盖野蛮人“升级”。请参阅下面的代码&评论

方法调用

exports.listByUser = function(req, res) {
    Attack.find({user: req.user._id}, function(err, attacks) {
        if(err) 
            return next(err);
        for(var i in attacks) {
            attacks[i].evaluateFight(); //here it evaluates every user's attack, 
                                          which wasn't evaluated yet
        }
        res.json(attacks);
    });
};

方式

AttackSchema.methods.evaluateFight = function() {
    if(!this.result.evaluated && (this.arriveTime < Date.now())) {
        var player = {}, barbarian = {};
        var attack = this;
        mongoose.model('User').findOne({_id: this.user}, function(err, user) {
            mongoose.model('Game').findOne({_id: user.game}, function(err, game) {
                var barbarianQuery = _.find(game.barbarians, function(field) {
                    if(field._id.equals(attack.barbarian)) return true;
                });
                if(barbarianQuery) {
                    // perform an attack evaluation and update barbarian's castle in game
                        mongoose.model('Game').findOneAndUpdate( 
                            { '_id': game._id, 'barbarians._id': attack.barbarian },
                            { '$set': { 'barbarians.$': barbarianQuery } },
                            function(err, data) {
                                console.log(err);
                                console.log(data);
                            }
                        );
                        attack.save();
                    }
                }
            });
        });
    }
}

第二次攻击评估与同一个野蛮人计算,然后覆盖第一次攻击评估的结果。例如,在第一个玩家获胜时 - 野蛮人成长为2级并更新,其次是玩家失败 - 野蛮人再次被淹没到1级...... 是否有任何选项可以在mongoDB或其他解决方案中锁定更新的集合如何修复此错误?谢谢你的回答!

0 个答案:

没有答案