在Mongo / Express / Node中检索多个集合时出错

时间:2016-07-07 11:38:19

标签: node.js mongodb express

我正在构建一个页面,需要从几个不同的Mongodb集合中检索和列出数据。我已经在Express路由器功能中进行了单独的查询,然后将结果添加到一个数组中,该数组被传递到访问每个部分的相关数据的页面。到目前为止,这最多可以使用三个查询,但是,如果我添加第四个查询,我会收到错误。

路由器功能如下所示:

router.get('/thetest',function(req,res){
    var finalResult = {};
    var MongoClient = mongodb.MongoClient;
    var url = 'mongodb://localhost:27017/myapp';
    MongoClient.connect(url, function(err, db){
        if(err){
            console.log("Connection Error",err);
        }else{
            var collection = db.collection('cats');
            collection.find({}).toArray(function(err,result){
                if(err){
                    console.log("Error retrieving cats");
                }else if (result.length){
                    finalResult.ctlist = result;
                    console.log("cats OK");
                }
            });
            var collection = db.collection('mice');
            collection.find({}).toArray(function(err,result){
                if(err){
                    console.log("Error retrieving mice");
                }else if (result.length){
                    finalResult.mclist = result;
                    console.log("mices OK");
                }
            });

            var collection = db.collection('cheese');
            collection.find({}).toArray(function(err,result){
                if(err){
                    console.log("Error retrieving cheese");
                }else if (result.length){
                    finalResult.chlist = result;
                    console.log("Cheese OK");
                }else{
                    console.log('No Documents');
                }

            });
            var collection = db.collection('mice');
            collection.find({}).sort({tailLength:1}).limit(3).toArray(function(err,result){
                if(err){
                    console.log("Error retrieving  alert bookings");
                }else if (result.length){
                    finalResult.mtlist = result;
                    console.log("Mouse tail length ok");
                    res.render('thetest',{
                        "thelist":finalResult
                    });
                }
                db.close();
            });
        }
    });
});

(使用虚拟集合名称)

因此,对三个不同的集合进行了四次查询。使用每个循环将结果列在Jade模板中。

如果我注释掉这四个查询中的任何一个,只运行其他三个查询就可以了:结果列在页面上。如果我取消注释并运行所有四个查询,那么Node将会阻塞,显然,页面上没有列出任何内容。没有一个集合大小超过六个文档,每个文档都有少量字段。

我对这一切都很陌生,我明白这可能不是我正在尝试的最佳方式。

任何人都可以a)解释我出错的地方和/或b)建议更好的方法吗?

由于

2 个答案:

答案 0 :(得分:2)

我认为问题是由于您的代码造成的。

Node.js是一种异步编程语言,因此所有操作都是平行的。

在您的代码' db.close();'关闭数据库连接。例如。如果所有db操作并行工作并且第4个(在您的代码中)首先执行,那么它将关闭数据库连接。所以这不是一个好的编程风格。

所以你可以使用' async'解决这个问题的库。 https://github.com/caolan/async

示例代码:

async.parallel([
  function(callback){
    dbOperation1(query, callback);
  },
  function(callback){
    dbOperation2(query2, callback);
  },
  function(callback){
    dbOperation3(query3, callback);
  },
  function(callback){
    dbOperation4(query4, callback);
  }
],
function(err, results){
  if (err) {
     renderError(err);
  } else {
     renderHTML(results[0], results[1], results[2], results[4]);
  }
});

答案 1 :(得分:0)

如果你评论所有四个条件,那么我很确定你正在评论<script src="https://www.gstatic.com/charts/loader.js"></script> <div id="chart_div"></div>

因此代码被堵塞了。因为快递API总是等待响应,如果你没有提供回复句子,那么有一段时间会等待然后崩溃。

解决方案:您必须编写您的响应声明。