我正在学习编码并使用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;
}
答案 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;
}