Promise API

Последнее обновление: 28.04.2019

Драйвер 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);
          });
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850