2016-11-15 13 views
1

我基本上相信這個錯誤是由於我打電話的對象不包含.populate函數,儘管我不知道如何改變它的工作。TypeError:populate(...)。exec不是函數

首先,這裏是完整的錯誤。

TypeError: exam[0].modules[u].topics[i].populate(...).exec is not a function 
    at /home/ubuntu/workspace/tests/app.js:425:84 
    at Query.Model.$wrapCallback (/home/ubuntu/workspace/tests/node_modules/mongoose/lib/model.js:3336:16) 
    at /home/ubuntu/workspace/tests/node_modules/mongoose/node_modules/kareem/index.js:259:21 
    at /home/ubuntu/workspace/tests/node_modules/mongoose/node_modules/kareem/index.js:127:16 
    at nextTickCallbackWith0Args (node.js:420:9) 
    at process._tickCallback (node.js:349:13) 


Process exited with code: 1 

我指的是具體線路是exam[0].modules[u].topics[i].populate("questions").exec(function(err,quests)另一條線,我相信是顯著這裏重要的是,它返回exam不包含.populate功能行examBoard.find({name:req.body.examBoardName},function(err,exam)

我認爲這很大程度上取決於我缺乏經驗,而不是邏輯錯誤,但我不確定。

以下是包含錯誤的代碼部分。

app.post("/test",function(req,res) 
{ 
    console.log("\n\n\n\n") 
    var time = req.body.time; 
    var topicName = [req.body.topic1,req.body.topic2,req.body.topic3,req.body.topic4,req.body.topic5]; 
    var topicsArray = []; 
    examBoard.find({name:req.body.examBoardName},function(err,exam) 
    { 
     if(err) 
     { 
      console.log(err); 
     } 
     else 
     { 
      for(var u=0;u<exam[0].modules.length;u++) 
      { 
       console.log("exam[0].modules[u]:\n"+exam[0].modules[u]); 
       console.log("req.body.moduleName:\n"+req.body.moduleName); 
       if(exam[0].modules[u].name==req.body.moduleName) 
       { 
        console.log("topicName[]:\n"+topicName[0]+"\n"+topicName[1]+"\n"+topicName[2]+"\n"+topicName[3]+"\n"+topicName[4]); 
        for(var i=0;i<exam[0].modules[u].topics.length;i++) 
        { 
         console.log("exam[0].modules[u].topics[i].name:\n"+exam[0].modules[u].topics[i].name); 
         for(var t=0;t<topicName.length;t++) 
         { 
          if(exam[0].modules[u].topics[i].name==topicName[t]) 
          { 
           // exam[0].modules[u].topics[i].find({name:topicName[t]}).populate("questions").exec(function(err,quests) 
           exam[0].modules[u].topics[i].populate("questions").exec(function(err,quests) 
           { 
            if(err) 
            { 
             console.log(err); 
            } 
            else 
            { 
             console.log("exam[0].modules[u].topics[i].questions:\n"+exam[0].modules[u].topics[i].questions); 
             topicsArray.push({ 
              name:topicName[i], 
              questions:quests 
             }); 
            } 
           });  
          } 
         } 
        } 
        break; 
       } 
      } 
     } 
    }); 
}); 

這裏是examBoard模式。

var mongoose = require("mongoose"); 

var topicSchema = new mongoose.Schema({ 
    name: String, 
    questions:[ 
     { 
      type:mongoose.Schema.Types.ObjectId, 
      ref:"question" 
     } 
    ], 
}); 

var moduleSchema = new mongoose.Schema({ 
    name: String, 
    topics: [topicSchema] 
}); 

var examBoardSchema = new mongoose.Schema({ 
    name: String, 
    modules: [moduleSchema] 
}); 

module.exports = mongoose.model("examBoard", examBoardSchema); 

而這裏只是爲了防止這裏可能出現問題,導入模式。

var express     = require("express"), 
    mongoose    = require("mongoose"), 
    passport    = require("passport"), 
    bodyParser    = require("body-parser"), 
    LocalStrategy   = require("passport-local"), 
    passportLocalMongoose = require("passport-local-mongoose"), 

    seedDB     = require("./seeds"), 
    question    = require("./models/question"), 
    examBoard    = require("./models/examBoard"), 
    user     = require("./models/user"); 

回答

0

要調用從exam[0].modules[u].topics[i]populate方法,但實際上模型對象持此方法是exam[0],所以你可以在一個很深的對象的層次結構像這樣填入您的考題:

exam[0].populate("modules.topics.questions") 

但等待一秒,現在模型將填寫所有主題中的問題所有模塊考試。從docs

var options = { 
    path: 'modules.topics.questions', 
    match: { 'modules.name': req.body.moduleName } 
}; 

exam[0].populate(options) 

利爾更多populate參數:

在你的情況,你通過MODULENAME先過濾,這樣你就可以配置populate選項,所以是這樣。

+0

它肯定會在所有模塊中的所有主題中填充所有問題,儘管在數據庫增長時它的效率會非常低。 我想你提到了這一點,但是當你說把它從for循環中移出來時,我不確定這將如何阻止它填充所有內容,你能舉個例子嗎? –

+0

@ JonathanWoollett-light檢查我的回答,上面用你的用例編輯。 –

+0

Thnak你,這是我認爲我只需要學習存在的東西。 –