NodeJS与mysql异步让我很困惑

时间:2016-05-21 21:58:21

标签: mysql node.js asynchronous node-mysql

我是NodeJS的新手。我有以下代码段。

var connection = mysql.createConnection(dbConfig);

connection.connect(function(err) {
    if (err)
        console.log("MySQL Connection Error: ", err);
    else
        console.log("Connection successfully established");

});

connection.query("SELECT * FROM `members1617`;",function(err,rows) {
    if (err)
        console.log("err: ", err);
    else
        console.log("rows: ",rows);

    connection.end();
});

这是不好的代码吗?我认为这是因为无法保证connection.connect()已完成,并且在激活查询之前已建立连接。并且在建立连接之前对查询进行了检查,然后会出现各种错误。异步如何在这里工作?

1 个答案:

答案 0 :(得分:2)

我建议您使用knex,这是一个用于热门node-mysql库的简单查询构建器包装器。

初始化knex后,您将获得一个对象是数据库的连接池。该对象可以使用链接的函数来执行查询。查询将返回promise,只有在正确建立连接后才会执行。 Knex会自动为您完成此操作。

您的代码如下:

function getMembers(){
  return knex.select().from('members1617')
     .then(rows => return rows)
     .catch(err => console.log(err))
}

就这么简单。

我还建议您使用诸如Bluebird之类的承诺库,以便您可以正确处理承诺和承诺链。

请注意:无论您是否选择使用knex或node-mysql,我强烈建议您学习如何使用promises或生成器来处理Node中的异步控制流。您可以使用几个教程和博客。