Promise API em Node.js
O driver MySQL2 permite o uso de Promise ao executar consultas no banco de dados. Por exemplo:
const mysql = require("mysql2");
const connection = mysql
  .createConnection({
    host: "localhost",
    user: "root",
    database: "usersdb2",
    password: "123456",
  })
  .promise();
// obtenção de objetos
connection
  .query("SELECT * FROM users")
  .then((result) => {
    console.log(result);
  })
  .catch((err) => {
    console.log(err);
  });Para criar uma Promise ao criar o objeto connection, o método promise() é chamado. Em seguida, ao realizar a consulta utilizando o método query(), podemos encadear os métodos then() e catch().
Se ocorrer um erro durante a execução da consulta, o método catch() executa a função passada como parâmetro. Essa função recebe um parâmetro, que é o objeto de erro.
Se a consulta for bem-sucedida, o método then() é chamado e executa a função fornecida como parâmetro. Esta função recebe como parâmetro o resultado da consulta. O resultado pode variar dependendo da instrução SQL enviada ao servidor.
Para a instrução SELECT, o resultado da consulta é um array de dois objetos, onde o primeiro objeto contém os dados retornados do banco de dados em forma de array, e o segundo contém metadados dos campos. Podemos acessar os dados diretamente da seguinte forma:
connection
  .query("SELECT * FROM users")
  .then((result) => {
    console.log(result[0]);
  })
  .catch((err) => {
    console.log(err);
  });Ou assim:
connection
  .query("SELECT * FROM users")
  .then(([rows, fields]) => {
    console.log(rows);
  })
  .catch((err) => {
    console.log(err);
  });O output no console em ambos os casos será algo como:
C:\node\mysqlapp> node app.js
[ TextRow { id: 2, name: 'Tom', age: 34 },
  TextRow { id: 4, name: 'Alice', age: 25 },
  TextRow { id: 5, name: 'Kate', age: 28 },
  TextRow { id: 6, name: 'Tim', age: 22 },
  TextRow { id: 7, name: 'Tom', age: 34 },
  TextRow { id: 8, name: 'Helen', age: 28 },
  TextRow { id: 9, name: 'Bill', age: 25 } ]Se a instrução SQL for INSERT, UPDATE ou DELETE, o resultado da consulta será um objeto cujas propriedades descrevem o resultado da operação:
const mysql = require("mysql2");
const connection = mysql
  .createConnection({
    host: "localhost",
    user: "root",
    database: "usersdb2",
    password: "123456",
  })
  .promise();
const sql = "INSERT INTO users (name, age) VALUES (?, ?)";
const user = ["Stan", 19];
connection
  .query(sql, user)
  .then((result) => {
    console.log(result[0]);
  })
  .catch((err) => {
    console.log(err);
  });O resultado da consulta é um array de dois objetos, onde o primeiro elemento descreve os resultados da operação. Neste caso, o output no console será algo como:
C:\node\mysqlapp> node app.js
ResultSetHeader {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 11,
  info: '',
  serverStatus: 2,
  warningStatus: 0 }Por exemplo, com a propriedade affectedRows do objeto resultante, podemos obter o número de linhas afetadas pela operação (adicionadas/excluídas/atualizadas).
Tudo o que foi mencionado sobre o método query() também se aplica ao método execute(), que funciona de maneira semelhante:
connection
  .execute("SELECT * FROM users")
  .then(([rows, fields]) => {
    console.log(rows);
  })
  .catch((err) => {
    console.log(err);
  });