Mongoose的原子更新

时间:2016-10-31 05:53:47

标签: express mongoose passport.js atomicity

我想让我的应用的用户只增加一次value。以下代码失败,因为mongoose中的update是异步的。对于此api的下一个连续请求,我的检查if(user.valueIncremented)失败,因为此时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();
	}
})	




1 个答案:

答案 0 :(得分:0)

这里我向数据库添加了一个额外的查询。现在,当我对此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();
		}		
	})
})