javascript - 用于将子文档连接到其父文档的端点,不返回任何内容

标签 javascript node.js express mongoose

我使用 mongooseexpress 创建博客类别列表,其中包含属于该类别的博客文章(使用其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/

相关文章:

node.js - Mongoose - 如何将文档添加到具有该文档 ID 的数组中

node.js - Discord OAuth2 返回 '{"错误“: "access_denied"}'

javascript - Mongoose Populate 以获取用户的所有帖子返回空数组

node.js - NodeJS 转发客户端 SSL 证书

JavaScript 克隆表行 - 重置值

javascript - 如何添加 block 元素(位置: absolute) under an active/hover li item?

javascript - 计数器不根据功能改变颜色

javascript - 如何在 JavaScript 中验证包含 “00:07 PM” 的日期?

javascript - Puppeteer:如何监听innerHTML 变化

javascript - Puppeteer:在waitForNavigation 后page.evaluate 不起作用,调试在page.evaluate 内部不起作用