NodeJS и MariaDB, ждите результата запроса - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть следующий код:

pool.getConnection()
.then(conn => {
    return conn.query("SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA='SquadgoalsDB';")
        .then((rows)=>{
            for(let i=0; i< rows.length;i++){
                tableNames.push(rows[i].table_name)
            }
            tableNames = []
            if(tableNames.length == 0){
                throw new Error("NO_TABLES_FOUND")
            }
            return conn.query("select DISTINCT(column_name) from information_schema.columns WHERE TABLE_SCHEMA='SquadgoalsDB'")
        })
        .then((rows)=>{
            for(let i=0; i< rows.length;i++){
                columnNames.push(rows[i].column_name)
            }
            if(columnNames.length == 0){
                throw new Error("NO_COLUMNS_FOUND")
            }
            conn.end()
            console.log("MariaDB connection works")
        })
        .catch((err) =>{
            throw err;
            conn.end()
        })

}).catch(err =>{
    console.log("not connected to mariadb due to error: " + err);
});


module.exports.tableNames = tableNames;  //always empty
module.exports.columnNames = columnNames; // always empty

Я хочу найти все имена таблиц и столбцов в моей базе данных. После этого у меня есть еще кое-что для запуска сервера, и я хочу экспортировать два массива, показанных выше, но они всегда пусты, потому что мы не ждем запросов? Как я могу дождаться (возможно, с помощью async / await) завершения кода, приведенного выше, и после этого продолжить экспорт и другие операции?

Спасибо за помощь

1 Ответ

0 голосов
/ 16 ноября 2018

Я полагаю, что вы можете сделать это так: await должен дождаться завершения всей цепочки обещаний и получить объект, представляющий решенное или отклоненное обещание.Но имейте в виду, что экспорт также является асинхронной операцией, так что это может произойти до завершения функции.

Лучший способ работы с системой асинхронизации - использовать обратный вызов.Вам нужно экспортировать метод назначения обратного вызова, чтобы получить обратный вызов и вызвать его при асинхронном выполнении.

module.exports = pool.getConnection()
    .then( async (conn) => {
       return await conn.query("SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA='SquadgoalsDB';")
            .then((rows)=>{
                for(let i=0; i< rows.length;i++){
                    tableNames.push(rows[i].table_name)
                }
                tableNames = []
                if(tableNames.length == 0){
                    throw new Error("NO_TABLES_FOUND")
                }
                return conn.query("select DISTINCT(column_name) from information_schema.columns WHERE TABLE_SCHEMA='SquadgoalsDB'")
            })
            .then((rows)=>{
                for(let i=0; i< rows.length;i++){
                    columnNames.push(rows[i].column_name)
                }
                if(columnNames.length == 0){
                    throw new Error("NO_COLUMNS_FOUND")
                }
                conn.end()
                console.log("MariaDB connection works")
            })
            .catch((err) =>{
                throw err;
                conn.end()
            })

    }).catch(err =>{
        console.log("not connected to mariadb due to error: " + err);
    });

И в другом файле вы можете сделать:

(async function(){

  let foo = await require("./codeabove");
  console.log(foo);
})();
...