我有一个JS函数,它将一个UserArticle添加到数据库中(使用mongoose和NodeJS)。问题是它没有到达终点。
我的意思是,我已经尝试确定大部分时间到达的地方,在Provider.findOne
之前,或User.find
之前。
var insertUserArticleToAllSubscribers = function (base_ua, providerId) {
var Provider = mongoose.model('Provider');
var User = mongoose.model('User');
var UserArticle = mongoose.model('UserArticle');
Provider.findOne({"twitter_id": providerId}, function (err, provider) {
if (err) {
console.log(err);
return;
}
if (provider) {
User.find({"subscribed": provider._id}, function (err, users) {
if (err) {
console.log (err);
return;
}
if (users) {
for (i in users) {
var ua = new UserArticle ({"user": users[i], "article":base_ua.article, "place":base_ua.place, "read":0, "starred":0});
ua.save(function (err) {
if (err) console.log(err);
logAddedArticle(ua._id, users[i]);
console.log("ArticleAdded!: " + ua._id);
});
}
} else {
console.log("No users");
}
})
}
})
}
我不明白为什么在没有抛出任何错误的情况下它没有到达函数的末尾。这段代码中有错误吗?
实际上,它有时会到达函数的末尾,但几乎总是没有。
谢谢
答案 0 :(得分:1)
假设Provider.findOne()实际上正在调用回调(希望是一个安全的假设),那么在第一次else
调用时你可能需要if( provider )
。
现在你有了这个逻辑结构:
function (...) {
Provider.findOne(..., function (...) {
if (err) { ... }
if (provider) {
User.find(..., function(...) {
if (err) { ... }
if (users) { ... }
else { ... }
})
}
})
如果将其更改为此结果,您可能会得到一个结果:
function (...) {
Provider.findOne(..., function (...) {
if (err) { ... }
else if (provider) { // MAKE THIS AN ELSE IF
User.find(..., function(...) {
if (err) { ... }
else if (users) { ... } // MAKE THIS AN ELSE IF!
else { ... }
})
}
else { // ADD THIS ELSE!
console.log('findOne() found nuttin :(');
}
})