我使用 mongoose
和 express
创建博客类别列表,其中包含属于该类别的博客文章(使用其category_id)。
我的思考过程是,获取所有类别,使用下划线
遍历它们,对于每个博客类别,找到他们的博客文章并将它们附加到posts
下的对象,并将其插入数组中然后输出。
exports.listWithPosts = function(req, res, next) {
BlogCategory.find({}, function(err, blogCategories) {
var blog = [];
if (err) {
return res.status(404).send(err);
}
_.each(blogCategories, function(blogCategory) {
BlogPost.find({ category: blogCategory._id }, function(err, blogPosts) {
if (err) {
return res.status(404).send(err);
}
blogCategory.posts = blogPosts;
// returns the category and has no posts property
console.log(blogCategory)
blog.push(blogCategory);
})
});
res.json(blog);
});
}
我错过了什么吗?每当我在 console.log
时没有得到我所期望的内容时,我就会假设这里某处需要一个 promise ,就像当我 res.json(blog)
时它是一个空数组。
最佳答案
我要简化你的代码:
BlogCategory.find({}, function(err, blogCategories) {
var blog = [];
_.each(blogCategories, function(blogCategory) {
BlogPost.find({ category: blogCategory._id }, function(err, blogPosts) {
blogCategory.posts = blogPosts;
blog.push(blogCategory);
});
});
res.json(blog);
});
BlogPost.find()
是异步的,这就是为什么它会晚于 res.json(blog);
执行。这就是为什么您会看到 blog
是一个空数组。
您可以使用 promise :
const find = Promise.promisify(BlogPost.find); // using `bluebird` module
function findPost(blogCategory) { // this will return a Promise
return find({ category: blogCategory._id }) // this is the promisified `BlogPost.find` method
.then(function(blogPosts) {
blogCategory.posts = blogPosts;
return blogPosts;
});
}
然后您只需映射 blogCategories
以便所有项目都返回一个 promise :
const categories = blogCategories.map(blogCategory => findPost(blogCategory));
然后您在类别
上使用Promise.all
。
Promise.all(categories) // Promise.all takes an array of promises as an argument
.then(function(blog) { // blogs is an array of resolved values
res.json(blog);
})
我真的希望这能有所帮助,并且我没有搞砸任何事情,我正在临时写这篇文章。
关于javascript - 用于将子文档连接到其父文档的端点,不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38914168/