Javascript nodejs中的多个异步mongo请求
如何在一行中写入多个查询 像一个Javascript nodejs中的多个异步mongo请求,javascript,node.js,mongodb,asynchronous,Javascript,Node.js,Mongodb,Asynchronous,如何在一行中写入多个查询 像一个 Space.findOne({ _id: id }, function(err, space) { User.findOne({ user_id: userid }, function(err, user) { res.json({ space: space, user: user}); }); }); 如果有更多的请求和逻辑,看起来不太好 它是如何正确完成的 我听说了一些关于承诺的事情,但我不知道 谢谢当我遇到类似问题时,我使
Space.findOne({ _id: id }, function(err, space) {
User.findOne({ user_id: userid }, function(err, user) {
res.json({ space: space, user: user});
});
});
如果有更多的请求和逻辑,看起来不太好
它是如何正确完成的
我听说了一些关于承诺的事情,但我不知道
谢谢当我遇到类似问题时,我使用了图书馆
如果需要顺序执行,也可以使用async.series。@Benjamin的方法是正确的。Mongoose还提供了
populate
方法,该方法获取多个通过id相互关联的对象。这也是并行发生的,是多个查询的特例。有关更多示例,请参阅。如果您使用支持承诺的Node.js 4+,则可以将查询包装为承诺
queryPromise = function(findQueryCursor) {
return new Promise(function(resolve, reject) {
findQueryCursor.toArray(function(err, data) {
resolve(data);
});
});
};
然后,创建由查询组成的承诺数组:
promiseAr = [];
promiseAr.push(
queryPromise(
db.collection('dbname').find(query1)
)
);
promiseAr.push(
queryPromise(
db.collection('dbname').find(query2)
)
);
然后打电话
Promise.all(promiseAr)
.then(function(dataArray) {
// results of query1 in dataArray[0]
// results of query2 in dataArray[1]
})
.catch(function(err) {
// catch errors
});
查询将并行发送到MongoDB,所有查询完成后将调用“.then”函数
之所以必须这样做,是因为.find()函数返回一个游标,然后必须调用.toArray()来检索数据。toArray()本身是异步的,因此如果您想使用Promise,就必须将其包装在Promise中。all.您希望函数彼此异步执行还是像示例代码中那样一起执行?注意,使用
.bind
可以缩短此代码,但为了清楚起见,我避免使用它。注意:,两年后——我会用承诺来做这件事,它们是解决这个问题的更优雅的解决方案。如果有人在意,请留下评论,我会用promises.awesome代码添加答案。花了半个小时寻找答案,这是唯一更新的答案。这一点应该向上投票。谢谢我应该为所有承诺使用一个连接实例,还是为每个承诺使用一个实例?当我在promise中创建一个连接实例时,我得到错误响应“在调用MongoClient.prototype.db之前必须连接MongoClient”,我不再处理Mongo了。我的猜测是,在发送查询之前,您需要先等待连接返回。将连接包装在承诺中,然后执行connectPromise()。然后(结果)。。。然后发送您的查询。如果您使用的是ES6,那么您可以使用异步/等待语法,有些人认为这种语法更简单。这与语法更清晰的承诺是一样的。
Promise.all(promiseAr)
.then(function(dataArray) {
// results of query1 in dataArray[0]
// results of query2 in dataArray[1]
})
.catch(function(err) {
// catch errors
});