NodeJS与mysql的asynchronous令我感到困惑

我是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()已经完成并且连接已经build立。 而id连接之前,查询是esecuted然后会有各种各样的错误。 Async在这里工作如何?

我build议你使用knex ,一个简单的查询生成器包装为stream行的节点mysql库。

在初始化knex之后,你会得到一个对象是连接池到你的数据库。 该对象可以有链接的function来执行查询。 查询将返回承诺,只有在连接正确的情况下才会执行。 Knex自动为你做这个。

你的代码如下所示:

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

就这么简单。

我也build议你使用蓝鸟这样的承诺库,这样你就可以正确地处理承诺和承诺链。

请注意:无论您select使用knex还是node-mysql,我都强烈build议您学习如何使用承诺或生成器来处理Node中的asynchronous控制stream。 有几个教程和博客在您的处置。