在快速

时间:2017-07-27 19:20:50

标签: arrays node.js express

我正在学习编码并使用Mongo,Express和NodeJS构建一个琐事游戏。我已经设法构建了一个游戏,从数据库中提取随机琐事问题,获取用户的答案,并检查它是否正确。

现在游戏一直持续到用户退出并经常重复提问。为了阻止这种情况,我想从数据库中随机抽取一组10个问题,以便我可以循环使用这些问题。

到目前为止,我所做的是创建一个函数,从数据库中抓取一个随机问题,检查它是否已经在数组中,如果不是,则将其推送到数组。但我似乎无法访问阵列中的问题。当我在浏览器中打开路径时,我只看到一个空数组。

我一直盯着这么长时间,并且非常混乱,以至于我确信我已经离开了轨道。

这是我的代码:

router.get("/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;
}

1 个答案:

答案 0 :(得分: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("/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;
    }