【问题标题】:ExpressJS mongodb multiple queriesExpressJS mongodb 多个查询
【发布时间】:2013-10-27 00:28:22
【问题描述】:

我想用两个集合获取数据。 如何在一个响应中发送此数据?

这是我的代码:

    //RETURN SINGLE QUERYE
exports.findById = function(req, res) {
    //Get Params
    var querye_id =new BSON.ObjectID(req.params.id); 
    var querye;

    //Get Single Querye
    db.collection('queryes', function(err, collection) {
        collection.findOne({'_id':querye_id}, function(err, item) {
            querye=item;
        });

    });
    //Get Questions and Answers
    db.collection('questions', function(err, collection) {
        collection.find().toArray(function(err, items) {
            querye.questions=items;
        });
    });

    //Send Response
     res.send(querye);

};

我有未定义的变量查询。如何解决?

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:
    var async = require('async');
    
    function getQueries(id, callback) {
      db.collection('queryes', function(err, collection) {
        collection.findOne({'_id':id}, callback);
      });
    }
    
    function getQuestions(callback) {
      db.collection('questions', function(err, collection) {
        collection.find().toArray(callback);
      });
    }
    
    exports.findById = function(req, res) {
      var querye_id =new BSON.ObjectID(req.params.id);
      async.parallel({
        querye: async.apply(getQueries, query_id),
        questions: getQuestions
      }, function (error, results) {
        if (error) {
          res.status(500).send(error);
          return;
        }
        results.querye.questions = results.questions;
        res.send(results.querye);
      });
    };
    

    【讨论】:

      【解决方案2】:

      您可能应该做的是使用延迟/承诺以瀑布方式获取结果,然后在一切完成后返回结果。

      我喜欢使用 node 的异步库。

      https://npmjs.org/package/async

      这让您可以将所有异步函数排队,然后报告成功/失败。最后你会得到结果。

      假设您已经需要异步模块,您的代码将如下所示。

      exports.findById = function(req, res) {
          //Get Params
          var querye_id =new BSON.ObjectID(req.params.id);
      
          async.waterfall([
              function(callback){
                  //Get Single Querye
                  db.collection('queryes', function(err, collection) {
                      collection.findOne({'_id':querye_id}, function(err, item) {
                          callback(null, item);
                      });
                  });
              },
              function(arg, callback){
                  //Get Questions and Answers
                  db.collection('questions', function(err, collection) {
                      collection.find().toArray(function(err, items) {
                          arg.questions=items;
                          callback(null, arg);
                      });
                  });    
              }],function(err, results){
                  //Send Response
                  res.send(results);
          });
      };
      

      【讨论】:

      • 是的,你是对的。那是一个简单的疏忽。同一个库还提供了一种将级联调用的“瀑布”方法。只需很少更改代码即可使用它。
      • 我更新了我的答案以显示从平行到瀑布的变化。
      猜你喜欢
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 2015-03-01
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      相关资源
      最近更新 更多