2016-10-31 67 views
0

我想讓我的應用程序的用戶僅增加一次value。以下代碼失敗,因爲貓鼬中的update是異步的。我的支票if(user.valueIncremented)因爲此時未更新valueIncremented,但會在下一個事件循環中更新,因此對此API的下一個連續請求失敗。那麼,我該怎麼做,先生?Mongoose中的原子更新

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

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

+0

你在哪裏設置req.user.valueIncremented?它是如何失敗的? –

回答

0

在這裏,我已經添加了額外的數據庫查詢。現在,當我對這個api進行兩次或更多次的連​​續呼叫時,value只會增加一次。

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