NodeJS async / await class mysql / mariadb

时间:2017-10-03 22:29:01

标签: mysql node.js class asynchronous async-await

我尝试了一些我认为很简单的东西:nodejs 8.6,MariaDB,MySQL2 / promise和classes。但它不起作用:

以下是一个简单的例子:

const mysql = require('mysql2/promise');

class mySQLClass {
    constructor() {
        this.mysqlConn = null;
    }

    async initialize() {
        try {
            this.mysqlConn = await mysql.createConnection({
                host: 'localhost',
                user: 'root',
                password: '',
                database: 'myschema'
            });

            console.log('intialize complete - createConnection successful: ');

        } catch (err) {
            console.log('initialize failed: ' + err);
        }
    }

    async showMeSomeData() {
        try {
            const [rows, fields] = await this.mysqlConn.execute('select * from information_schema.tables where table_schema = \'information_schema\'');
            console.log('data: ' + rows);
        } catch (err) {
            console.log('showMeSomeData failed: ' + err);
        }
    }

}

const test = new mySQLClass();

test.initialize();

test.showMeSomeData();

当我运行程序时,它失败了:

  

showMeSomeData失败:TypeError:无法读取属性'execute'of null

     

初始化完成 - createConnection成功

因此,似乎在showMeSomeData()执行之前,initialize()没有完成。我认为等待会让它正常工作吗?

我错过了什么吗? 有更好的方法吗?

由于

1 个答案:

答案 0 :(得分:0)

在顶层,异步函数仍然返回一个promise。你必须这样做:

echo -e "\n..."

要让您的代码正常工作,您必须在课堂上隐藏额外的承诺:

const test = new mySQLClass();

test.initialize().then(() => {
  test.showMeSomeData();
});

如果你想获取数据,你仍然必须在顶层使用promises,但你的console.logs至少会在带内发生。