ExpressJS mongodb多个查询

时间:2013-10-26 15:55:10

标签: node.js mongodb express

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

这是我的代码:

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

};

我有varible querye未定义。怎么解决这个问题?

2 个答案:

答案 0 :(得分: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);
  });
};

答案 1 :(得分:-1)

您应该做的是使用deferreds / promises以瀑布方式获取结果,然后在完成所有操作后返回结果。

我喜欢使用节点的异步库。

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