Добавить async / await при использовании пакета mysql с Node JS - PullRequest
0 голосов
/ 09 марта 2020

Я создаю этот скрипт Migration JS, используя Node JS. Ниже приведен полный код этого переноса. js file.

const mysql = require("mysql");
var con = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '',
});

// Create Connection
con.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

  console.log('MySQL connected as id ' + con.threadId);
});

// Create Database
const db_name = 'nuxt_mysql';
con.query("CREATE DATABASE IF NOT EXISTS " + db_name, function (err, result) {
  if (err) throw err;
  console.log(`Database "${db_name}" created.`);

  // Select db
  con.changeUser({database : db_name}, function(err) {
    if (err) throw err;
    console.log(`Database "${db_name}" selected.`);

    // Create Tables
    createTables();
  });
});


// Create Tables
function createTables(){
  createArticlesTable();
  createUsersTable();

  // Close Connection after tables are created
  con.end();
  console.log('MySQL connection closed.');
}

// Create Articles Table
function createArticlesTable(){
  let sql = `CREATE TABLE IF NOT EXISTS articles (

      id INT AUTO_INCREMENT NOT NULL,
      title VARCHAR(255) NOT NULL,
      author VARCHAR(255) NOT NULL,
      body TEXT NOT NULL,
      date_added TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      date_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

      PRIMARY KEY (id)
  )`;
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(`Table "articles" created.`);
  });
}

// Create Users Table
function createUsersTable(){
  let sql = `CREATE TABLE IF NOT EXISTS users (

      id INT AUTO_INCREMENT NOT NULL,
      full_name VARCHAR(255) NOT NULL,
      email VARCHAR(255) NOT NULL,
      password VARCHAR(255) NOT NULL,
      date_added TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      date_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

      PRIMARY KEY (id),
      UNIQUE KEY (email)
  )`;
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(`Table "users" created.`);
  });
}

Этот сценарий сначала создает базу данных. Затем он выбирает эту базу данных и затем создает таблицы под ней, используя различные функции, созданные для каждой таблицы.

Когда я запускаю перенос узла. js, это вывод.

MySQL connected as id 257
Database "nuxt_mysql" created.
Database "nuxt_mysql" selected.
MySQL connection closed.
Table "articles" created.
Table "users" created.

Теперь проблема в том, что я хочу закрыть соединение mysql после создания всех таблиц. И я думаю, что мне придется добавить функцию asyn c где-нибудь. Я не очень хорош с async / await, поэтому решил опубликовать его.

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Я изменил код для возврата нового Promise () при создании таблиц с использованием метода db.query, а затем обновил метод createTables (), чтобы использовать эти обещания. Теперь он работает как положено.

Вот код.

// Create Tables
function createTables(){
  Promise.all([
    createArticlesTable(),
    createUsersTable()
  ]).then(() => {
    con.end();
    console.log("MySQL connection closed.");
  });
}

// Create Articles Table
function createArticlesTable(){
  let sql = `CREATE TABLE IF NOT EXISTS articles (

      id INT AUTO_INCREMENT NOT NULL,
      title VARCHAR(255) NOT NULL,
      author VARCHAR(255) NOT NULL,
      body TEXT NOT NULL,
      date_added TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      date_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

      PRIMARY KEY (id)
  )`;
  return new Promise((resolve, reject) => {
    con.query(sql, function (err, result) {
      if (err) throw err;
      console.log(`Table "articles" created.`);
      resolve(result);
    });
  });
}

// Create Users Table
function createUsersTable(){
  let sql = `CREATE TABLE IF NOT EXISTS users (

      id INT AUTO_INCREMENT NOT NULL,
      full_name VARCHAR(255) NOT NULL,
      email VARCHAR(255) NOT NULL,
      password VARCHAR(255) NOT NULL,
      date_added TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      date_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

      PRIMARY KEY (id),
      UNIQUE KEY (email)
  )`;
  return new Promise((resolve, reject) => {
    con.query(sql, function (err, result) {
      if (err) throw err;
      console.log(`Table "users" created.`);
      resolve(result);
    });
  });
}
0 голосов
/ 09 марта 2020

Вы можете использовать async-await для функции, которая возвращает обещание. Вы можете использовать упаковщик обещаний или модуль mysql2, который использует обещания Bluebird.

Фрагмент кода из mysql2

async function main() {
  // get the client
  const mysql = require('mysql2/promise');
  // create the connection
  const connection = await mysql.createConnection({host:'localhost', user: 'root', database: 'test'});
  // query database
  const [rows, fields] = await connection.execute('SELECT * FROM `table` WHERE `name` = ? AND `age` > ?', ['Morty', 14]);
}

Или вы можете использовать обещание- mysql , который является оберточной оболочкой для MySQL

В качестве альтернативы:

const mysql = require('mysql')
const { promisify } = require('util')

const databaseConfig = {
}

const pool = mysql.createPool(databaseConfig)
const promiseQuery = promisify(pool.query).bind(pool)
const promisePoolEnd = promisify(pool.end).bind(pool)

const query = `select 1;`
const result = await promiseQuery(query) // use in async function

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