Javascript Node.js,Mongoose函数第一次返回错误,但第二次不返回
我有一个从MongoDB数据库返回一些元素的函数,但是我的变量有问题。它说我的一个变量第一次没有定义,但是如果我刷新,错误就会消失。所以我认为这是一个定义在内部作用域中的全局变量的错误,它不能被第一次访问或者类似的东西 这是我的代码: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
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
}
});