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