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