Выполнять синхронные MySQL запросы в NodeJS - PullRequest
0 голосов
/ 27 марта 2020

Я выполняю поиск в Google в течение 5 дней, надеюсь найти решение ... Я знаю, что оно не работает, потому что оно асинхронное, но мне нужна программа (это бот Discord), чтобы ответить данные, которые я получаю из БД. Я пробовал Обещания и обратные вызовы, но я не знаю, так ли это, потому что я новичок с асинхронным, что у меня ничего не работает.

        const con = mysql.createConnection({
            host: datos.host,
            user: datos.user,
            password: datos.password,
            database: datos.database
        });

        function leerPromesa() {
            var promise = new Promise(function (resolve, reject) {
                con.query('SELECT * from ranking;', function (err, rows, fields) {
                    if (err) {
                        reject(err);
                        return
                    }

                    resolve(rows);
                    rows.forEach(element => console.log(element));

                })
            });

            return promise;
        };


        var promesa = leerPromesa();
        promesa.then(
            function (rows) {
                rows.forEach(element => msg.reply(element));
            },
            function (err) {
                msg.reply(err);
            }
        );

        con.end();

То, что делает бот, отвечает пустым текстом.

1 Ответ

0 голосов
/ 30 марта 2020

Во-первых, вы на самом деле не подключаетесь к базе данных.

Если вы ссылаетесь на документы https://github.com/mysqljs/mysql:

var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});

// then connect method
connection.connect();

Таким образом, ваш код никогда не будет работать ..

Во-вторых, вы закрываете соединение перед выполнением любого запроса:

con.end();

Правильно закрывать соединение после leerPromesa выполнения функции.

Наконец, код может выглядит примерно так:

const con = mysql.createConnection({
  host: datos.host,
  user: datos.user,
  password: datos.password,
  database: datos.database
});

con.connect();

function leerPromesa() {
  return new Promise(function(resolve, reject) {
    con.query("SELECT * from ranking;", function(err, rows, fields) {
      if (err) {
        return reject(err);
      }
      return resolve(rows);
    });
  });
}

leerPromesa()
  .then(
    function(rows) {
      rows.forEach(element => msg.reply(element));
    },
    function(err) {
      msg.reply(err);
    }
  )
  .finally(function() {
    con.end();
  });

Я использовал finally метод на Promise, чтобы закрыть соединение в любой ситуации https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally

...