2017-07-27 84 views
0

我正在學習編寫代碼並使用Mongo,Express和NodeJS構建了一個瑣事遊戲。我設法構建了一個遊戲,從數據庫中抽取一個隨機的瑣事問題,獲取用戶的答案,並檢查它是否正確。返回mongo數據庫中的一個隨機子集

現在遊戲一直持續到用戶退出並且問題經常重複。爲了阻止這一點,我想從數據庫中隨機抽取10個問題,這樣我就可以循環這些問題。

我到目前爲止所做的是創建一個函數,從數據庫中抓取一個隨機問題,檢查它是否已經存在於數組中,如果不存在,則將其推送到數組。但我似乎無法訪問陣列中的問題。當我在瀏覽器中打開路由時,我只看到一個空數組。

我一直在盯着這麼長時間,並且非常混亂,以至於我相信我已經走上了正軌。

這裏是我的代碼:

router.get("https://stackoverflow.com/q/", function(req,res){  
    res.send(getQuestions());  
}); 


function getQuestions() { 

    var quiz = new Array(); 

    for(var i = 0; i < 10; i++) { 

     Question.findOneRandom(function(err, randomQuestion){ 

      if(err){ 
       console.log(err); 
      } else { 
       if(!containsObject(randomQuestion, quiz)) { 
        console.log("Adding question"); 
        quiz.push(randomQuestion); 
       } else { 
        console.log("It was a duplicate."); 
       } 
      } 
     }); 
    } 

    return quiz; 
} 


function containsObject(obj, list){ 
    for (var i = 0; i < list.length; i++){ 
     if (list[i].question === obj.question) { 
      return true; 
     } 
    } 
    return false; 
} 

回答

0

你正在做一個for循環內的異步工作,所以在第一個查詢甚至開始getQuestions功能與空數組返回。您應該考慮更多地瞭解nodejs應用程序的異步本質。這裏有一些很好寫着:

Understanding Async Programming in Node.js

Node.js Async Best Practices & Avoiding the Callback Hell

要回答你的問題,你可以做這樣的事情(使用async庫):

const async = require('async'); 

    router.get("https://stackoverflow.com/q/", function(req,res){  
     // res.send(getQuestions()); 
     getQuestions(function(err, quiz) { 
      if(err) { 
       console.log('an error has occured', err); 
       return res.send(500); 
      } 

      res.send(quiz); 
     }); 
    }); 


    function getQuestions(cb) { 
     var quiz = new Array(); 

     const dummyArray = new Array(10); 
     async.eachSeries(dummyArray, function(ignored, done) { 
      Question.findOneRandom(function(err, randomQuestion){ 
       if(err){ 
        // console.log(err); 
        done(err); 
       } else { 
        if(!containsObject(randomQuestion, quiz)) { 
         // console.log("Adding question"); 
         quiz.push(randomQuestion); 
        } else { 
         // console.log("It was a duplicate."); 
        } 

        done(); 
       } 
      }); 
     }, function(err) { 
      if(err) return cb(err); 

      cb(null, quiz); 
     }); 

     // for(var i = 0; i < 10; i++) { 
     //  Question.findOneRandom(function(err, randomQuestion){ 
     //   if(err){ 
     //    console.log(err); 
     //   } else { 
     //    if(!containsObject(randomQuestion, quiz)) { 
     //     console.log("Adding question"); 
     //     quiz.push(randomQuestion); 
     //    } else { 
     //     console.log("It was a duplicate."); 
     //    } 
     //   } 
     //  }); 
     // } 

     // return quiz; 
    } 


    function containsObject(obj, list){ 
     for (var i = 0; i < list.length; i++){ 
      if (list[i].question === obj.question) { 
       return true; 
      } 
     } 

     return false; 
    } 
+0

謝謝 - 這個作品。我想我需要更多地閱讀以瞭解到底發生了什麼,但感謝您的幫助! – djdrysdale