簡體   English   中英

如何保存從mongoose中的query.exec()函數返回的對象

[英]How to save the Object returned from the query.exec() function in mongoose

我是貓鼬的新手。 這是我的場景:

var childSchema = new Schema({ name: 'string' });
var parentSchema = new Schema({
children: [childSchema]});
var Parent = mongoose.model('Parent', parentSchema);

假設我已經創建了一個帶有子項的父級'p',我正在查詢'p',使用

var query = Parent.find({"_id":"562676a04787a98217d1c81e"});
query.select('children');                                   
query.exec(function(err,person){                            
    if(err){                                                    
        return console.error(err);                               
    } else {                                                     
        console.log(person);                                     
    }
});                                                    

我需要訪問異步函數之外的person對象。 有關如何做到這一點的任何想法?

Mongoose的find()方法是異步的 ,這意味着你應該使用一個可以從find()方法包裝查詢的回調。 例如,在您的情況下,您可以將回調定義為

function getChildrenQuery(parentId, callback){
    Parent.find({"_id": parentId}, "children", function(err, docs){
        if (err) {
          callback(err, null);
        } else {
          callback(null, docs);
        }
    }); 
}

你可以這樣調用:

var id = "562676a04787a98217d1c81e";
getChildrenQuery(id, function(err, children) {
    if (err) console.log(err);

    // do something with children
    children.forEach(function(child){
      console.log(child.name);
    });
});

您可以采用的另一種方法是exec()方法返回Promise的promises,因此您可以執行以下操作:

function getChildrenPromise(parentId){
   var promise = Parent.find({_id: parentId}).select("children").exec();
   return promise;
}

然后,當您想要獲取數據時,您應該將其設為異步:

var promise = getChildrenPromise("562676a04787a98217d1c81e");
promise.then(function(children){
    children.forEach(function(child){
        console.log(child.name);
    });
}).error(function(error){
    console.log(error);
});

你不能在回調之外訪問它(=你提到的“異步函數”)。 這就是node.js的工作原理:

  • 你對數據庫的調用需要一些時間 - 很長一段時間你將它與只執行一個簡單的代碼語句進行比較。
  • Node.js是非阻塞的,因此它不會等待數據庫返回結果,並且它會在query.exec語句之后執行代碼而立即繼續。
  • 所以在query.exec語句運行之后編寫的代碼在數據庫返回結果之前運行,因此無法在那里使用該結果。

但是......擁抱異步編程:

  • 只需將所需的所有代碼寫入“異步函數”
  • 將回調傳遞給您的函數,從“異步函數”調用它並將查詢結果傳遞給它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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