我在API上有这个代码:
var data = (req.method == 'POST') ? req.body : req.query;
if (!data.betId || !data.userId) return res.apiError('wrong request payload');
BetUser.model.findOne({bet: data.betId, user: data.userId}).exec(function(err, bets){
if (bets){
return res.apiError('you placed the bet for this bet', bets);
}
var bet_item;
item = new BetUser.model({bet: data.betId, user: data.userId});
item.getUpdateHandler(req).process(data, function(err) {
if (err) return res.apiError('error', err);
Bet.model.findById(data.betId).exec(function(err, bet){
if (err) return res.apiError('database error', err);
switch(parseInt(item.betChoice)){
case 0:
bet.drawTeamBets +=1;
break;
case 1:
bet.firstTeamBets +=1;
break;
case 2:
bet.secondTeamBets +=1;
break;
};
bet.drawTeamBets = 1000;
console.log(bet);
bet.save();
console.log(bet);
bet_item = bet;
});
User.model.findById(data.userId).exec(function(err, user){
if (err) return res.apiError('database error', err);
user.gold -= item.betAmount;
user.save();
res.apiResponse({
bet_detail : item,
user : user,
bet : bet_item
});
});
});
});
问题是Bet对象没有更新,那两个console.log打印旧对象。 在这种情况下如何保存赌注?同时User对象已更新。太奇怪了。
答案 0 :(得分:0)
我认为你必须定义一个在保存操作后调用的函数,有两种方法可以做到,第一种:
bet.save(function (err, bet) {
if (err){ console.log(err); }
console.log('saved bet: ', bet);
// place for other code after save operation..
});
使用返回的Promise:
bet.save().then(function (bet) {
console.log('saved bet: ', bet);
// place for other code after save operation..
});
了解更多详情和示例:mongoosejs.com/docs/api.html#model_Model-save
答案 1 :(得分:0)
试试这个......
Bet.model.findById(data.betId).exec(function(err,bet){ if(错误)返回res.apiError('数据库错误',错误);
switch(parseInt(item.betChoice)){
case 0:
bet.drawTeamBets +=1;
break;
case 1:
bet.firstTeamBets +=1;
break;
case 2:
bet.secondTeamBets +=1;
break;
};
bet.drawTeamBets = 1000;
console.log(bet);
bet.save();
console.log(bet);
bet_item = bet;
User.model.findById(data.userId).exec(function(err, user){
if (err) return res.apiError('database error', err);
user.gold -= item.betAmount;
user.save();
res.apiResponse({
bet_detail : item,
user : user,
bet : bet_item
});
});
});
将上一个mongoose查询嵌套在上一个查询的回调中。这将确保.save在最后一次查询之前触发。