我有2个集合(User和Offer),我使用async来执行一系列操作,但不删除最后一个文档。
async.series([
function (callback) {
User.findOne({_id: req.user._id}, function (err, result) {
if (err) {
return callback(err);
}
user = result;
callback();
});
},
function (callback) {
Offer.find({_owner: user._id}, function (err, offers) {
if (err) {
return callback(err);
}
var i = offers.length;
while (i--) {
var offer = offers[i];
Offer.remove(offer, function (err) {
return callback(err);
});
}
callback();
});
},
function (callback) {
User.remove(user, function (err) {
if (err) {
return callback(err);
}
});
callback();
}
], function (err) {
if (err) {
return res.status(503).json({message: err});
}
res.status(200).json({message: 'User and offers successfully deleted'});
});
我打开了mongoose调试,我看到该用户的8个文档被删除(正如预期的那样)。示例消息:
Mongoose: users.remove({ active: true, role: 'user', favoredOffers: [],
salt: 'qIADYcMS3SiAuF3M007E9g==', hashedPassword: '**', emailVerified: true,
name: 'Test', email: 'test1@test.com', emailVerificationToken: '***',
updatedAt: new Date("Mon, 21 Sep 2015 00:52:58 GMT"),
createdAt: new Date("Mon, 21 Sep 2015 00:52:58 GMT"),
_id: ObjectId("55ff54ea1d6201ff42ea0045") }) {
safe: { w: 'majority', wtimeout: 10000 } }
当我运行测试时,结果是,这个文档仍然存在。起初我认为我的测试运行得太快(async.waterfall)但后来我切换到async.series并且行为仍然存在,当我查看test-db时,文档仍然存在。
测试代码:
it.only('should allow deleting my account and all my offers if my password was right', function (done) {
async.series([function (callback) {
login(server, server.delete('*url*'), 'test@test.com', 'testpwd1', function (server) {
server
.send({password: 'testpwd1'})
.expect(200)
.end(callback);
});
}, function (callback) {
User.findOne({email: 'test1@test.com'}, function (err, user) {
callback(user ? new Error('user was still found in mongo') : null); //misuse not found user as 'error'-object
});
}, function (callback) {
Offer.find({_owner: user1._id}, function (err, offers) {
expect(offers).to.have.length(0);
callback();
});
}], done);
});
结果:未捕获的AssertionError:期望[Array(1)]长度为0但得到1
我错过了什么或者我不理解mongdb的行为。
答案 0 :(得分:2)
虽然按<div class="btn-group menuSection">
<div class="menuGrid" ng-repeat="main in mains">
<input type="radio" name="dishes"
class="btn btn-default btn-sm btn-block"
ng-value="main"
ng-model="$parent.selectedMain"
ng-change="setDish();"/>
{{main}}
</div>
<div class="menuGrid">
<input type="text" class="form-control input-sm"
ng-model="mainOtherText"
ng-show="selectedMain == 'Other'"
ng-change="setDish();"
placeholder="enter other here"/>
</div>
test : {{mainDish}}
</div>
分割的那些操作被串联调用,但问题是async.series
循环不是异步控制的,因此移动到下一阶段的回调是在所有删除完成之前被调用。
您可以使用async.whilst
来控制来自.remove()
操作的回调,但这样做太过分了,因为您真的应该发出&#34;查询&#34;直接转到while
,而不是尝试使用.remove()
返回的列表:
.find()
当然,如果删除操作的结果没有删除任何内容,那么您就知道输入与用户不匹配。
异步库允许回调传递,因此您不需要控制每个阶段。任何错误都会立即转到结束块,以及每个阶段的结果。另外,对于这种情况,请查看parallel
,因为一个阶段不依赖于另一个阶段首先完成。