Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mysql2中的承诺_Javascript_Mysql_Node.js_Mysql2 - Fatal编程技术网

Javascript mysql2中的承诺

Javascript mysql2中的承诺,javascript,mysql,node.js,mysql2,Javascript,Mysql,Node.js,Mysql2,最近我想学习Node.js来帮助我找到工作,所以我启动了一个网页抓取应用程序 我从mysql包开始,但在编写代码之后,我没有想到这是一个异步过程 然后我发现mysql2有承诺,但我不确定我是否理解如何正确使用它们,我的做法很糟糕 这是我的密码 const mysql = require('mysql2'); const pool = mysql.createPool({ ... }); var categorias = []; var querySQL; /* Here goes web

最近我想学习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") );

      });

    });


问题是我是否做得很好,或者有其他方法,因为这段代码是创建数据库的表(如果没有),然后插入数据。在每次网站更新内容的第一次插入之后,我将创建一个临时表来检查是否有一个新的类别,对象。。。因此,这让我在这个承诺中有了更多的承诺。

我建议尝试异步/等待语法,它使事情更具可读性

这应该满足您的愿望:

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

你们的承诺能让你们的链子拴得更牢一点,这篇文章帮助我更好地理解承诺

您应该避免嵌套承诺,您可以返回承诺的值来链接它们

我会像这样把你的承诺结构弄平

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

catch语句之后的
then
函数,是否意味着要在catch语句之后继续?好的,我喜欢这种方法,因为它更清晰,所以如果我想在这方面进行更多查询,我可以使用它们创建一个函数,并在createdb中使用它们,对吗?哦,当然,是的。我认为async/await语法读起来更像是同步代码,而且它比链接承诺处理程序更容易理解。当然,您可以传入参数并返回行!很高兴能帮上忙!快乐编码!!另一个答案在我看来更清晰,但谢谢你的文章和代码,当我对承诺有疑问时,它将非常有用