【问题标题】:Atomic update in MongooseMongoose 中的原子更新
【发布时间】:2017-03-13 05:50:30
【问题描述】:

我想让我的应用程序的用户只增加一次value。以下代码失败,因为 mongoose 中的 update 是异步的。我的检查 if(user.valueIncremented) 对这个 api 的下一个连续请求失败,因为此时 valueIncremented 没有更新,但它将在下一个事件循环中。那么,我该怎么办,好先生?

var Account = new Schema({
	_id: Schema.Types.ObjectId,
	value: {type: Number, default: 0},
	valueIncremented: {type: Boolean, default: false}
});

router.post('/incrementValue', function(req, res, next) {
	var user = req.user;
	if(user.valueIncremented) {
		return next();
	}
	else {
		incrementValue();
	}
	function incrementValue(){
		var condition = {
			_id: user._id;
		}
		var update = {
			$inc: {
				value: 1
			},
			$set: {
				valueIncremented: true
			}
		}
		Account.update(condition, update).exec();
	}
})	

【问题讨论】:

  • 你在哪里设置 req.user.valueIncremented?它到底是怎么失败的?

标签: express mongoose passport.js atomic


【解决方案1】:

在这里,我向数据库添加了一个附加查询。现在,当我对该 api 进行两次或多次连续调用时,value 只会增加一次。

router.post('/incrementValue', function(req, res, next) {
	var id = req.user._id;
	Account.findById(id).exec(function(err, user){
		if(err) {
			return next(err);
		}
		if(user.valueIncremented) {
			return next();
		}
		else {
			incrementValue();
		}
		function incrementValue(){
			var condition = {
				_id: id
			}
			var update = {
				$inc: {
					value: 1
				},
				$set: {
					valueIncremented: true
				}
			}
			Account.update(condition, update).exec();
		}		
	})
})

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多