繁体   English   中英

Node.js,Mongoose函数第一次返回错误,但第二次不返回

[英]Node.js, Mongoose function return an error the first time but not the second

我有一个函数可以从MongoDB数据库返回一些元素,但是我的变量有问题。 它说我的变量之一不是第一次定义,但是如果我刷新,错误就会消失。 因此,我认为这是在内部范围内定义的全局变量的错误,该范围无法首次访问或类似的东西。

所以这是我的代码:

exports.findQuestion = function findQuestion()
{
    var tabRand = new Array();      // on déclare un nouveau tableau où on va stocker les jets de rand
    var query = boardModel.find(null);      // on cherche toutes les entrées dans la collection 
    query.exec(function (err, tabQuestion) {
    if (err) { throw err;}
    var rep = tabQuestion[0];
    var rand = Math.floor((Math.random()*rep.question.length+1));   // random sur le tableau
    var i = false;
    tabRand[0] = 0;
    while (i == false)
    {
    for(var random in tabRand)      // on vérifie le résultat du rand avec les rand précédents
    {
        if(random != rand)          // si le rand est différent on le garde
        {
            i = true;
            if(tabRand.length-1 == rep.question.length) // si la taille de tabRand est égale à la longueur du tableau de questions de la collection alors on le reinitialise
            {
                tabRand = new Array();
            }
        }
    }
    tabRand.push[rand];     // on ajoute le rand précédent à tabRand
    rand = Math.floor((Math.random()*rep.question.length+1));   // et on en fait un nouveau
    }
    quest = rep.question[rand-1].quest; // on récupère le resultat attendu
    repJuste = rep.question[rand-1].rep_j;
    repFausse1 = rep.question[rand-1].rep_f1;
    repFausse2 = rep.question[rand-1].rep_f2;
    gainQ = rep.question[rand-1].gain;
    nomTr = rep.question[rand-1].name_t;
    });
return [quest, repJuste, repFausse1, repFausse2, gainQ, nomTr];
}

所以第一次,它说任务没有定义,但是一切都很好...

PS:对不起,半法语,半英语代码^^

我在这里看到一个问题,您不能在异步函数中返回某些内容,而应该使用回调。

如果您想了解它:

  • 您执行异步查询(并且您在回调中使用结果tabQuestion执行了某些操作)

  • 和您返回的东西,但您不确定异步功能是否已完成。

尝试使用async.js来帮助您管理异步问题

编辑:

async.parallel([
function(callback){ 
boardModel.find().exec(function (err, tabQuestion) {
    if (err) { throw err;}
    var rep = tabQuestion[0];
    var rand = Math.floor((Math.random()*rep.question.length+1));   // random sur le tableau
    var i = false;
    tabRand[0] = 0;
    while (i == false)
    {
    for(var random in tabRand)      // on vérifie le résultat du rand avec les rand précédents
    {
        if(random != rand)          // si le rand est différent on le garde
        {
            i = true;
            if(tabRand.length-1 == rep.question.length) // si la taille de tabRand est égale à la longueur du tableau de questions de la collection alors on le reinitialise
            {
                tabRand = new Array();
            }
        }
    }
    tabRand.push[rand];     // on ajoute le rand précédent à tabRand
    rand = Math.floor((Math.random()*rep.question.length+1));   // et on en fait un nouveau
    }
    quest = rep.question[rand-1].quest; // on récupère le resultat attendu
    repJuste = rep.question[rand-1].rep_j;
    repFausse1 = rep.question[rand-1].rep_f1;
    repFausse2 = rep.question[rand-1].rep_f2;
    gainQ = rep.question[rand-1].gain;
    nomTr = rep.question[rand-1].name_t;
    });
    callback(null, quest, repJuste, repFausse1, repFausse2, gainQ, nomTr);
}],
function(err){
    if(err){ 
        console.log(err);
    }else{
        console.timeEnd('chargement bd');
        socket.emit('event', {'quest': quest, 'repJuste' : repJuste }); //add all your params
    }               
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM