2017-07-27 4 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

関連する問題