Драйвер MySQL2 позволяет использовать промисы при выполнении запросов к бд. Например:
const mysql = require("mysql2"); const connection = mysql.createConnection({ host: "localhost", user: "root", database: "usersdb2", password: "123456" }).promise(); // получение объектов connection.query("SELECT * FROM users") .then(result =>{ console.log(result); }) .catch(err =>{ console.log(err); });
Для создания промиса при создании объекта connection вызывается метод promise(). Затем при выполнении запроса
с помощью метода query()
мы можем к нему по цепочке подсоединить методы then() и catch().
Если при выполнении запроса возникла ошибка, то метод catch()
выполняет функцию, которая передается в метод в качестве параметра.
Эта функция принимает один параметр - собственно объект ошибки.
Если запрос выполнился успешно, то вызывается метод then()
, который выполняет функцию, передаваемую в качестве параметра.
Эта функция принимает в качестве параметра результат запроса. Результат запроса может оличаться в зависимости от посылаемой серверу команды SQL.
Для команды SELECT результат запроса фактически представляет массив из двух объектов, где первый объект - полученные из БД данные в виде массива, а второй - метаданные полей данных. То есть мы могли бы получить непосредственно сами данные так:
connection.query("SELECT * FROM users") .then(result =>{ console.log(result[0]); }) .catch(err =>{ console.log(err); });
Или так:
connection.query("SELECT * FROM users") .then(([rows, fields]) =>{ console.log(rows); }) .catch(err =>{ console.log(err); });
Консольный вывод в обоих случаях будет наподобие следующего:
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 } ]
Если выполняется SQL-команда INSERT, UPDATE или DELETE, то результатом запроса будет объект, свойства которого описывают результат операции:
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); });
Опять же результат запроса представляет массив из двух объектов, где собственно результаты операции описываются первым элементом. В частности, в данном случае консольный вывод будет наподобие следующего:
C:\node\mysqlapp> node app.js ResultSetHeader { fieldCount: 0, affectedRows: 1, insertId: 11, info: '', serverStatus: 2, warningStatus: 0 }
Например, с помощью свойства affectedRows
полученного объекта мы можем получить количество затронутых операцией (добавленных/
удаленных/обновленных) строк.
Все, что было выше сказано про метод query()
относится и к методу execute()
, который работает аналогичным образом:
connection.execute("SELECT * FROM users") .then(([rows, fields]) =>{ console.log(rows); }) .catch(err =>{ console.log(err); });