Обещания в mysql2 - PullRequest
       8

Обещания в mysql2

0 голосов
/ 03 октября 2019

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

Я начал с пакета mysql, но после написания кода я не имел в виду этоэто асинхронный процесс.

Тогда я нашел mysql2 с обещаниями, но я не уверен, что понимаю, как их правильно использовать, и я делаю плохую практику.

Вот мой код


const mysql = require('mysql2');

const pool = mysql.createPool({ ... });

var categorias = [];
var querySQL;

/*
Here goes web scraping stuff not needed in this question
*/

pool.getConnection(function(err, connection){

      if(err) throw err;

      querySQL = "SELECT 1 FROM Categories LIMIT 1";

      connection.promise().query(querySQL).then(([rows,fields])=> {

        if (rows!=undefined) {
          console.log("The table already exist");
        }else {

          querySQL = "CREATE TABLE Categories (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))";

          connection.query(querySQL,function(err,rows,field){

            if(err) throw err;

            console.log("The table has been created");
            console.log(rows);

          });

        }

      })
      .catch(console.log)
      .then( ()=> {

        querySQL = "SELECT x FROM y";

        connection.promise().query(querySQL).then(([rows,fields])=> {

          /*
          More stuff
          */

        })
        .catch(console.log)
        .then( ()=> console.log("Promise ended") );

      });

    });

Вопрос в том, правильно ли я выполняю цепочки обещаний или есть другой способ, потому что этот код предназначен для создания таблиц базы данных, если их нет, а затем вставки данных. После первой вставки каждый раз, когда веб-сайт обновляет свое содержимое, я создам временную таблицу, чтобы проверить, есть ли новая категория, объект ... и т. Д., Так что это приводит меня к большему обещанию в этих обещаниях.

Ответы [ 2 ]

3 голосов
/ 03 октября 2019

Я бы предложил попробовать синтаксис async / await, он делает вещи немного более читабельными.

Это должно делать то, что вы хотите:

async function tableExists(pool, tableName) {
    try {
        const query = `SELECT 1 FROM ${tableName} LIMIT 1;`;
        await pool.execute(query);
        return true;
    } catch (err) {
        return false;
    }
}

async function createdb() {
    const mysql = require('mysql2/promise');

    const config = {
        host: 'host',
        user: 'username',
        password: 'password_goes_here',
        database: 'some_database'
    }

    const pool = mysql.createPool(config);

    let tableOk = await tableExists(pool, "categories");
    if (tableOk) {
        console.log("Table 'Categories' already exists.");
        return;
    }
    console.log("Table 'Categories' does not exist, creating...");

    try { 
        const createQuery = "CREATE TABLE Categories (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20));";
        await pool.execute(createQuery);
        console.log("Table created successfully.");
    } catch (err) {
        console.error("Table creation failed:", err);
    }

    pool.end();
}

createdb();
1 голос
/ 03 октября 2019

Ваши обещания могут быть лучше прикованы цепочкой, у нас есть проблема с обещаниями статья помогла мне лучше понять обещания.

Вам следует избегать вложенных обещаний, и в вашем случае вы можете возвращать значенияваших обещаний связать их. Отличный пример о цепочке обещаний

Я бы сгладил вашу структуру обещаний следующим образом.

pool.getConnection(function(err, connection){
    if(err) throw err;
    var querySQL = "SELECT 1 FROM Categories LIMIT 1";
    return connection.promise().query(querySQL)
    .then((results)=> {
      if (results.rows!=undefined) {
        console.error("The table already exist");
        throw "The table already exist";
      }
      else {
        let querySQL = "CREATE TABLE Categories (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))";
        return connection.query(querySQL);
      }
    })
    .then((err, rows,) => {
        if(err) throw err;
        console.log("The table has been created");
        console.log(rows);
        return rows;
    })
    .catch(console.log)
    .finally(()=> {
      var querySQL = "SELECT x FROM y";
      return connection.promise().query(querySQL)
    })
    .then((results, error) => {
        /*
        More stuff
        */
        return nextPromise;
    //   .then( ()=> console.log("Promise ended") );

    })
    .then(() =>{
        console.log("Promise ended")
    })
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...