Я новичок в мире nodeJS и пытаюсь подключить базу данных mysql. Сначала я выбираю команду (экипировку), а после этого я должен выбрать всех членов этой команды.
Наконец, я хочу создать массив с моими командами и участниками (в lesEquipes var). Когда код доходит до 3-го, мой var равен нулю! Почему пожалуйста ?
Вот мой код:
class Database {
constructor() {
this.connection = mysql.createConnection({
host: "192.x.x.x",
user: "john",
password: "mypass",
database: "mybase"
});
}
query(sql, args) {
return new Promise((resolve, reject) => {
this.connection.query(sql, args, (err, result, fields) => {
if (err) return reject(err);
resolve (result);
});
});
}
close() {
return new Promise((resolve, reject) => {
this.connection.end(err => {
if (err) return reject (err);
resolve();
});
});
}
}
var database = new Database();
.............
app.post('/visu',function(req,res){
//console.info(nodedump(req.params.mdp));
//console.info(req.body);
// codage en dur de l'authentification
if ((req.body.email == "[email protected]") && (req.body.mdp == "password")){
var leUser = "administrateur";
let lesEquipes = new Array();
let test = 'Toto';
database.query("select * from equipe order by id")
.then( result => {
for (var i = 0; i < result.length; i++) {
let courante = new Array();
let nomEquipe = result[i].nomEquipe;
let idEquipe = result[i].id;
courante[0] = result[i];
var sql2 = "select * from participant where equipe = " + result[i].id;
//console.info(sql2);
database.query(sql2)
.then(result2 => {
console.info("Membres de l'équipe : " + nomEquipe);
courante[1] = result2;
console.info("COURANTE 2 "+ JSON.stringify(courante));
lesEquipes[idEquipe] = courante;
let test = 'AUTRE CHOSE';
/*
console.info("QUERY 2 "+ JSON.stringify(result2));
for (var j = 0; j < result2.length; j++) {
participant = result2[j].nom;
console.info(participant);
}
*/
//res.render('visuEquipes.ejs', { user:leUser, equipes:lesEquipes});
//console.info("Contenu "+ JSON.stringify(lesEquipes));
return ""; //database.query(sql3);
});
}
console.info("Contenu "+ JSON.stringify(test));
console.info("Contenu "+ JSON.stringify(lesEquipes));
}).then(result3 =>{
console.info("result 3 : "+result3);
console.info("Contenu "+ JSON.stringify(test));
**// THIS VAR IS NULL NULL NULL lesEquipes
console.info("Contenu "+ JSON.stringify(lesEquipes));**
res.render('visuEquipes.ejs', { user:leUser, equipes : lesEquipes});
}).catch((err) => {
console.info(err);
database.close();
});






Проблема в том, что вы выполняете асинхронный код внутри цикла.
for (var i = 0; i < result.length; i++) {
/**/
database.query(sql2).then(result2 => {
/**/
});
}
Таким образом, в .then(result3 =>{ переменная lesEquipes, скорее всего, не была инициализирована.
Вы должны подождать, пока все обещания не исполнятся. Вы можете легко добавить массив обещаний.
const promises = [];
for (var i = 0; i < result.length; i++) {
promises.push(database.query(sql2).then(result2 => {/*...*/}));
}
return Promise.all(promises);
Или вы можете использовать библиотеку async-p для итерации массива, или, что еще лучше, вы можете использовать конструкции ES7 async-await.
Большой ! Он отлично работает с массивом обещаний. Большое спасибо !