如何连续编写多个查询?
像一个
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.parallel([
function(callback){
Space.findOne({ _id: id }, callback);
},
function(callback){
User.findOne({ user_id: userid },callback);
}
],
function(err, results){
res.json({space:results[0],user:results[1]});
});
如果您想要顺序执行,也可以使用 async.series。
@Benjamin 的方法是正确的。Mongoose 还提供了该populate
方法,该方法可以获取多个通过 id 相互关联的对象。这也是并行发生的,是多个查询的特例。有关更多示例,请参见http://mongoosejs.com/docs/populate.html。
如果您使用的是支持 Promises 的 Node.js 4+,您可以将查询包装在一个 Promise 中。
queryPromise = function(findQueryCursor) {
return new Promise(function(resolve, reject) {
findQueryCursor.toArray(function(err, data) {
resolve(data);
});
});
};
然后,创建一个由查询组成的 Promises 数组:
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.all,则必须将其包装在 Promise 中。