簡體   English   中英

Node.js中的多個異步mongo請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM