我的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或其他解决方案中锁定更新的集合如何修复此错误?谢谢你的回答!