Ожидайте, что не работает должным образом с пакетом JS MySQL - PullRequest
0 голосов
/ 07 апреля 2019

Я довольно новичок в Javascript / node и еще не понимаю концепцию. Следующий ниже код неясен для меня. Я хочу, чтобы "END" не показывался, пока я не получил все результаты из базы данных. Я надеюсь, что вы не скажете мне поместить его в вывод строк, и действительно есть решение этой проблемы. Я думал, что "ожидание" заставит код действительно ждать завершения его обработки.

const mysql = require('mysql'); // or use import if you use TS
const util = require('util');
const conn = mysql.createConnection({
    "host"     : "",
    "user"     : "",
    "password" : "",
    "database" : "",
});

// node native promisify
const query = util.promisify(conn.query).bind(conn);

(async () => {
  try {
    const rows = await query('select count(*) as count from table');
    console.log(rows);
  } finally {
    conn.end();
  }
})()

console.log("END");

Спасибо

1 Ответ

0 голосов
/ 07 апреля 2019

Вы не можете использовать это таким образом. Без обратного вызова MySQL вместо этого будет передавать результаты, и вам нужно использовать on прослушиватель событий.

Согласно документации:

Вы НЕ ДОЛЖНЫ предоставлять обратный вызов методу query () при потоковой передаче строк.

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

async function myQueryFunction(str, replacements) {
  return new Promise(resolve => {
    let rows = []
    query(str, replacements)
      .on('result', (row) => {
        // Do something with the row
        rows.push(row)
      })
      .on('end', () => resolve(rows))
  })
}

В противном случае вам нужно вызвать метод query с обратным вызовом, поэтому создайте функцию запроса, которая разрешает обещание ...

async function myQueryFunction(str, replacements) {
  return new Promise(resolve => {
    query(str, replacements, (err, rows) => {
      resolve(rows)
    })
  })
}

Наконец, вы можете вызвать свой метод, который был создан из одного из приведенных выше примеров, например:

(async () => {
  try {
    const rows = await myQueryFunction('select count(*) as count from table');
    console.log(rows);
  } finally {
    conn.end();
  }
})()

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