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);
});