使用来自2个不同mongoose查询的数据发送快速回复

时间:2015-08-21 13:00:29

标签: node.js express mongoose

我需要查询2个不同的集合并在明确的响应中发送它。对于需要做什么,我有一个非常含糊的想法。我试图将查询文档联系到一个空数组,并将该新数组作为响应发送。但我收到一个空数组作为回应。

这是我的路线。

  site.route('/campus/development')
    .get(function(req, res) {
        var devPosts = [];

        development.find().exec(function(err, docs) {
            if (err) {
                console.log('Error : ' + err);
            } else {
                if (docs != null) {
                    devPosts = devPosts.concat(docs);
                    console.log(docs);
                } else {
                    console.log('No posts found');
                }
            }
        });

        jobs.find().exec(function(err, jobs) {
            if (err) {
                console.log('Error : ' + err);
            } else {
                if (jobs != null) {
                    devPosts = devPosts.concat(jobs);
                    console.log(jobs);
                } else {
                    console.log('No jobs');
                }
            }
        });

        res.send(devPosts);
    });

1 个答案:

答案 0 :(得分:1)

这是由于对数据库的请求的异步操作。有各种各样的解决方案,但基本上可以提炼为两种类型:回调或承诺。

回调解决方案可能如下所示:

  site.route('/campus/development')
    .get(function(req, res) {
      development.find().exec(function(err, devDocs) {
        if (err) {
          console.log('Error : ' + err);
        } else {
          if (devDocs != null) {
            console.log(devDocs);

            jobs.find().exec(function(err, jobs) {
              if (err) {
                console.log('Error : ' + err);
              } else {
                if (jobs != null) {
                  console.log(jobs);

                  res.send([devDocs, jobs]);
                } else {
                  console.log('No jobs');
                }
              }
            });
          } else {
            console.log('No posts found');
          }
        }
      });
    });

但是这引入了一些有趣的问题:一个是称为回调地狱的现象,另一个是你应该回应错误,这意味着你需要对每个错误进行响应调用(尽管这是一个非常简单的方法)。

如前所述,还有另一种涉及使用承诺的解决方案。您可以使用一堆库,实际上Mongoose会从exec方法返回一个承诺。但是,如果你在Node 0.12.x上,你也可以使用本机Promise(它在0.11中引入,但你应该使用0.11.x而不是0.11.x)。使用本机承诺比使用Mongoose返回的承诺更有利的一点是,您可以并行执行这些请求,因为它们并不相互依赖。

site.route('/campus/development')
  .get(function(req, res) {
      Promise.all([
        development.find().exec(), // returns a promise
        jobs.find().exec() // returns a promise
      ]).then(function(results) {
        // results is [devDocs, jobs]
        console.log(results);

        res.send(results);
      }).catch(function(err) {
        res.send(err);
      });
  });