【问题标题】:Returning a random subset of a mongo database in express在 express 中返回一个 mongo 数据库的随机子集
【发布时间】:2017-07-28 07:06:26
【问题描述】:

我正在学习编码,并且一直在使用 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;
}

【问题讨论】:

    标签: arrays node.js express


    【解决方案1】:

    您正在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;
        }
    

    【讨论】:

    • 谢谢——这行得通。我想我需要阅读更多内容才能确切了解正在发生的事情,但感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    相关资源
    最近更新 更多