[英]multiple async mongo request in nodejs
如何連續編寫多個查詢?
像一個
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的方法是正確的。 貓鼬還提供了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中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.