我正在构建一个页面,需要从几个不同的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)建议更好的方法吗?
由于
答案 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总是等待响应,如果你没有提供回复句子,那么有一段时间会等待然后崩溃。
解决方案:您必须编写您的响应声明。