【问题标题】:Make synchronous MySQL queries in NodeJS在 NodeJS 中进行同步 MySQL 查询
【发布时间】:2020-07-08 14:06:28
【问题描述】:

我已经在谷歌搜索了 5 天,我希望找到解决方案...我知道它不起作用,因为它是异步的,但我需要程序(它是一个 Discord 机器人)以响应我从数据库中获得的数据。我已经尝试过 Promises 和回调,但我不知道是不是因为我是一个异步新手,所以对我没有任何作用。

        const con = mysql.createConnection({
            host: datos.host,
            user: datos.user,
            password: datos.password,
            database: datos.database
        });

        function leerPromesa() {
            var promise = new Promise(function (resolve, reject) {
                con.query('SELECT * from ranking;', function (err, rows, fields) {
                    if (err) {
                        reject(err);
                        return
                    }

                    resolve(rows);
                    rows.forEach(element => console.log(element));

                })
            });

            return promise;
        };


        var promesa = leerPromesa();
        promesa.then(
            function (rows) {
                rows.forEach(element => msg.reply(element));
            },
            function (err) {
                msg.reply(err);
            }
        );

        con.end();

机器人所做的是用空白文本响应。

【问题讨论】:

    标签: mysql node.js es6-promise discord.js


    【解决方案1】:

    首先,您并没有真正连接到数据库。

    如果您参考文档https://github.com/mysqljs/mysql:

    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'me',
      password : 'secret',
      database : 'my_db'
    });
    
    // then connect method
    connection.connect();
    
    

    所以你的代码永远不会工作..

    其次,您在执行任何查询之前关闭连接:

    con.end();
    

    正确的是在leerPromesa函数执行后关闭连接。

    最后,代码可能如下所示:

    const con = mysql.createConnection({
      host: datos.host,
      user: datos.user,
      password: datos.password,
      database: datos.database
    });
    
    con.connect();
    
    function leerPromesa() {
      return new Promise(function(resolve, reject) {
        con.query("SELECT * from ranking;", function(err, rows, fields) {
          if (err) {
            return reject(err);
          }
          return resolve(rows);
        });
      });
    }
    
    leerPromesa()
      .then(
        function(rows) {
          rows.forEach(element => msg.reply(element));
        },
        function(err) {
          msg.reply(err);
        }
      )
      .finally(function() {
        con.end();
      });
    
    

    我在 Promise 上使用了finally 方法来在每种情况下关闭连接https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 2023-03-28
      • 2020-11-03
      • 2020-10-22
      • 2017-05-23
      • 1970-01-01
      • 2016-03-22
      • 2014-03-28
      • 2016-06-02
      相关资源
      最近更新 更多