2

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

这是我的代码:

    //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);

};

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

4

2 回答 2

4
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);
  });
};
于 2013-10-26T16:13:19.463 回答
-1

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

我喜欢将异步库用于节点。

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);
    });
};
于 2013-10-26T16:04:26.470 回答