mysql - NodeJS 与 mysql 的异步让我感到困惑

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

最佳答案

我建议您使用knex ,一个简单的查询生成器包装器,适用于流行的 node-mysql图书馆。

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

您的代码如下所示:

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

就这么简单。

我还建议您使用 Promise 库,例如 Bluebird以便您可以正确处理 Promise 和 Promise 链。

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

关于mysql - NodeJS 与 mysql 的异步让我感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368422/

相关文章:

PHP MySQL - 从 select 语句中计算行数

java - java中可以通过trunk加载mysql数据trunk吗?

mysql - sql中的数据透视困难

javascript - Gulp-仅重命名文件而不是目录

javascript - 当客户端连接到服务器时,NODE.JS 中的 Async Await 失败

java - 异步任务停止工作,在使用断点调试时工作 - Android

mysql - 查询与字段的一个或多个条件匹配的行

javascript - Geddy.js - 在没有布局的情况下渲染部分 View ,可能吗?

javascript - csurf Node : csrf token used many times with no error

Java play框架 对同一对象的异步操作