在 express 中返回 mongo 数据库的随机子集



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

您正在for循环中执行异步工作,因此在第一个查询开始之前,getQuestions函数返回空数组。 您应该考虑了解有关 NodeJS 应用程序的异步性质的更多信息。 这里有一些很好的读物:

了解节点中的异步编程.js

Node.js Async Best Practices & Void the Callback Hell

要回答您的问题,您可以执行以下操作(通过使用异步库(:

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;
}

最新更新