Javascript / Node.js не ожидает ответа sql с ответом до продолжения кода - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть файл .js, который вызывает внешний файл .js, который запускает следующий код:

const sql = require('../../node_modules/mysql');

module.exports =
    {
        connect_to_db: function (sql_query)
        {
            let con = sql.createConnection({
                host: "localhost",
                user: config.server_username,
                password: config.server_password,
                database: config.database_name
            });

            con.connect((err)=> {
                if (err){
                    console.log("Problem connecting to the DB!");
                    return;
                }
                console.log("Connected to the DB!");
            });

            con.query(sql_query, (err, result) => {
                if (err) throw err;
                console.log('Data received from the DB');
                console.log(result);
                return result;
            });

            con.end((err) => {});


        }
    };

, который выполняется как:

const connect_to_DB = require('DB_Connection');     
let sql_query = "SELECT * FROM table";
                    database_results.push(connect_to_DB.connect_to_db(sql_query));

                    console.log(database_results);

, однако это приводит кзавершение кода до того, как запрос sql возвращается с результатом (данные удалены):

[ undefined ]

Connected to the DB!
Data received from the DB
[ RowDataPacket {
    mail_id: ,
    from: ,
    to: ',
    subject: ,
    message: ,
    date:,
    read_date:  } ]

Process finished with exit code 0

Похоже, что результат результата возвращается как неопределенный, так как нет ничего, что нужно было бы нажать в момент, когда он делает это,Однако я хочу, чтобы он дождался ответа на запрос, прежде чем он продолжится.

Возможно, я думал об обещании, но не уверен, что оно сработает примерно так:

    const sql = require('../../node_modules/mysql');

module.exports =
    {
        connect_to_db: function (sql_query)
        {
            return new Promise((resolve, reject) => {
                (async () => {
                    let con = sql.createConnection({
                        host: "localhost",
                        user: config.server_username,
                        password: config.server_password,
                        database: config.database_name
                    });

                    con.connect((err)=> {
                        if (err){
                            console.log("Problem connecting to the DB!");
                            return;
                        }
                        console.log("Connected to the DB!");
                    });

                    con.query(sql_query, (err, result) => {
                        if (err) throw err;
                        console.log('Data received from the DB');
                        console.log(result);
                        resolve();
                        return result;
                    });

                    con.end((err) => {});

                })();
            });
        }
    };

но когда я запускаю это, я получаю это обратно:

[ Promise { <pending> } ]

Мне просто нужна помощь для возвращения результата, а затем код для продолжения.

Ответы [ 2 ]

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

Вам не нужно использовать обещания и async / await в одном и том же фрагменте кода.Попробуйте что-то вроде этого:

module.exports =
{
    connect_to_db: async function (sql_query)
    {
        let con = sql.createConnection({
            host: "localhost",
            user: config.server_username,
            password: config.server_password,
            database: config.database_name
        });

        con.connect((err)=> {
            if (err){
                console.log("Problem connecting to the DB!");
                return;
            }
            console.log("Connected to the DB!");
        });

        return await con.query(sql_query);
    }
};

, а затем

const connect_to_DB = require('DB_Connection');     
let sql_query = "SELECT * FROM table";
database_results.push(await connect_to_DB.connect_to_db(sql_query));
console.log(database_results);

Обратите внимание, что sice await идентификатор ключевого слова разрешен только внутри async функций, эта строка database_results.push(await connect_to_DB.connect_to_db(sql_query)); должна находиться внутриасинхронная функция для работы

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

По моему мнению, лучший из возможных способов решения этой проблемы - использование обратных вызовов в Node js.

Узел js выполняет коды синхронно, позвольте мне объяснить, объяснив, что произошло с вашим кодом

database_results.push(connect_to_DB.connect_to_db(sql_query));
console.log(database_results);

Здесь, в вашем коде, console.log (database_results) возвращается перед выполнением функции connect_to_DB.connect_to_db(sql_query))

Ваш DBConnection.js может быть изменен как:

const sql = require('mysql');

exports.connect_to_db = function (sql_query, callback) {
let con = sql.createConnection({
    host: "localhost",
    user: config.server_username,
    password: config.server_password,
    database: config.database_name
});

con.connect((err) => {
    if (err) {
        console.log("Problem connecting to the DB!");
        return;
    }
    console.log("Connected to the DB!");
});

con.query(sql_query, (err, result) => {
    if (err) callback(err);
    console.log('Data received from the DB');
    console.log(result);
    callback(result);
});

con.end((err) => { });
};

, а внешние js, которые вызывают функцию connect_to_db, могут быть изменены как:

'use strict';

const connect_to_DB = require('DB_Connection');
let sql_query = "SELECT * FROM table";
connect_to_DB.connect_to_db(sql_query, function (data, err) {
  if (err) {
    console.log(err);
  }
  else {
    database_results.push(data);
  }
});

console.log(database_results);

чтобы узнать больше о обратных звонках посетить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...