Доступ к переменной mysql в nodejs после обещания

Я новичок в мире 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();
    });
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
0
49
1

Ответы 1

Проблема в том, что вы выполняете асинхронный код внутри цикла.

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.

Большой ! Он отлично работает с массивом обещаний. Большое спасибо !

Eric D. 30.05.2018 22:31

Другие вопросы по теме