Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js,Mongoose函数第一次返回错误,但第二次不返回_Javascript_Node.js_Mongodb - Fatal编程技术网

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

Javascript Node.js,Mongoose函数第一次返回错误,但第二次不返回,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我有一个从MongoDB数据库返回一些元素的函数,但是我的变量有问题。它说我的一个变量第一次没有定义,但是如果我刷新,错误就会消失。所以我认为这是一个定义在内部作用域中的全局变量的错误,它不能被第一次访问或者类似的东西 这是我的代码: exports.findQuestion = function findQuestion() { var tabRand = new Array(); // on déclare un nouveau tableau où on va stock

我有一个从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执行某些操作

返回一些东西,但不确定异步函数是否完成

尝试帮助您管理异步问题

编辑:


您不能从函数返回异步结果,必须使用回调。您可以签出等待模块npm WAIT。通过这种方式,您可以有效地等待从异步代码返回结果。约翰尼:我真的不理解您的评论:如何使用回调来执行我正在尝试执行的操作?丹尼尔:我会检查npm await,这似乎非常适合我想做的事情。我检查了await和async.js库,但我发现它们很难理解。我发现异步比等待更复杂。如果有人能解释或提供一个简单的例子来说明如何使用其中一个lib,我将非常感激和高兴^^尝试类似的方法,我将在我的项目中使用socket.io实现这一点,但是您会看到async.parallel执行一个异步函数数组,最后一个函数是回调函数,在所有异步函数完成后执行回调函数。我希望它对您和法式面包生活有用。您的函数回调代码中缺少了一个结束赞誉,我不知道该放在哪里。我还有一个问题,如何通过这个方法使用函数返回的变量。我是否使用客户端的套接字恢复它们?但在此之前,感谢你的回答;在关闭数组之前,我放置了缺少的分号。是的,我用来发送数据,只是在客户端代码中创建一个事件并获取它们。现在我在boardModel.find.exec上遇到一个错误,它说无法调用undefined的find方法。当我通过一个中间变量查询时也是如此。也许他现在无法访问boardModel?
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
    }               
});