mysql 的 NodeJS 异步让我感到困惑

NodeJS Async with mysql is confusing me

我是 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()在查询被激活之前已经完成并且已经建立了连接。并且在建立连接之前执行了查询,然后会出现各种错误。异步在这里如何工作?

我建议您使用 knex, a simple query builder wrapper for the popular node-mysql 库。

初始化 knex 后,您将获得一个对象,它是您数据库的连接池。该对象可以具有与其链接的函数以执行查询。查询将 return 承诺,并且只有在正确建立连接后才会执行。 Knex 会自动为您完成此操作。

您的代码如下所示:

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

就这么简单。

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

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