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/

相关文章:

javascript - 在 slider 上暂停视频

node.js - sequelize 的单个实例

javascript - 如何将url参数与返回的数据关联起来?

node.js - Express.js 多种方法

javascript - 如何使用 javascript 和 Coldfusion 填充动态创建的下拉框

Javascript parseFloat 10 而不是 e

javascript - 为什么 $(window).animate scrollTop 不起作用?

c++ - 在 ubuntu 上安装 npm 期间,使用 C++ 17 编译 native Node 插件失败

javascript - 在事件流期间更新数据库的最佳实践

mysql - INSERT INTO 正在向 mySQL 表中插入空值