我目前有以下代码:
User.find({ featuredMerchant: true })
.lean()
.limit(2)
.exec(function(err, users) {
if (err) {
console.log(err);
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
_.forEach(users, function(user){
_.forEach(user.userListings, function(listing){
Listing.find({
user: user
}).populate('listings', 'displayName merchantName userImageName hasUploadedImage').exec(function(err, listings){
user.listings = listings;
});
});
});
res.jsonp(users);
}
});
正如您所看到的,我正在尝试将检索到的商家信息添加到每个“用户”中。在'用户'我回来的精益物体。如果我在添加' user.listings = listing'之后在Listing.find exec方法中执行了console.log(user),结果就像我期望的那样;具有listing属性的用户对象,该listing属性包含检索到的所有列表。
但是,如果我在console.log中使用'用户'对象,找不到每个用户的列表。
我很确定我在这里做了些蠢事,但我真的无法解决问题。任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
你对愚蠢的事情是对的!
没有冒犯,我认为这是一个常见的错误:)
_.forEach(users, function(user){
_.forEach(user.userListings, function(listing){
Listing.find({
user: user
})
.populate('listings', 'displayName merchantName userImageName hasUploadedImage')
.exec(function(err, listings){
user.listings = listings;
});
});
});
// Listing.find inside foreach hasn't finish yet
// I suppose it's always an asynchronous call
res.jsonp(users);
也许你可以使用promises来修复它。这是q库的一个例子。
var promises = [];
_.forEach(users, function(user){
_.forEach(user.userListings, function(listing){
var deferred = q.defer();
promises.push(deferred);
Listing.find({
user: user
})
.populate('listings', 'displayName merchantName userImageName hasUploadedImage')
.exec(function(err, listings){
user.listings = listings;
deferred.resolve(user);
});
});
});
q
.all(promises)
.done(function(allUsers){
// Do what you want here with your users
res.jsonp(allUsers);
});
检查一下,不要犹豫,因为我无法对其进行测试。
答案 1 :(得分:0)
感谢您的投入。真的很感激。我设法解决这个问题更容易,现在我开始认为这很明显 - 但是我们生活和学习。基本上,我的'userListings'模型字段是Object Id的数组,我想将列表模型中的物理列表添加到返回的数据中。以下代码为我做了诀窍。
exports.findFeaturedMerchants = function(req, res, next) {
User.find({ featuredMerchant: true })
.populate('userListings')
.limit(2)
.exec(function(err, data) {
_.forEach(data, function(user){
Listing.populate(user.userListings, '', function(err, user){
if (err) {
console.log(err);
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
}
});
});
console.log(data);
res.jsonp(data);
});
};
我只需要将每个userListings对象填充到用户中,方法是使用populate函数两次 - 一次用于用户,另一次用于每个列表。我发现很难理解 - 可能是因为我不明白填充函数是如何工作的,但是我们去了:)
杰米