mysql - 使用 node-mysql 和 ExpressJS 在一个请求中执行两个或多个查询

标签 mysql node.js express node-mysql

tl;dr:使用带有 ExpressJS 的 node-mysql 处理对 MySQL 数据库的两个或多个异步查询的正确方法是什么?

我使用 ExpressJS 和 node-mysql 在 MySQL 数据库上执行两个独立的、不相关的数据库查询。由于响应是异步的,因此我嵌套了查询,这意味着它们最终会一个接一个地发生。

这似乎是一种丑陋、缓慢且通常不好的方法,尤其是在我要添加第三个或第四个查询时。

var mysql      = require('mysql');
var credentials = {...}

router.get('/api/url/', function (req, res) {
    return_data = {}
    var connection = mysql.createConnection(credentials);
    query1 = "SELECT column1 FROM table1 WHERE column2 = 'foo'";
    query2 = "SELECT column1 FROM table2 WHERE column2 = 'bar'";
    connection.query(query1, {}, function(err, results) {
        return_data.table1 = results;
        connection.query(query2, {}, function(err, results) {
            return_data.table2 = results;
            connection.end();
            res.send(return_data);
        });
    });
});

最佳答案

这是使用 async 的理想选择.这是您可以使用它重构它的一种方法:

var mysql      = require('mysql');
var async      = require('async');
var credentials = {...}

router.get('/api/url/', function (req, res) {
    var connection = mysql.createConnection(credentials);
    var query1 = "SELECT column1 FROM table1 WHERE column2 = 'foo'";
    var query2 = "SELECT column1 FROM table2 WHERE column2 = 'bar'";

    var return_data = {};

    async.parallel([
       function(parallel_done) {
           connection.query(query1, {}, function(err, results) {
               if (err) return parallel_done(err);
               return_data.table1 = results;
               parallel_done();
           });
       },
       function(parallel_done) {
           connection.query(query2, {}, function(err, results) {
               if (err) return parallel_done(err);
               return_data.table2 = results;
               parallel_done();
           });
       }
    ], function(err) {
         if (err) console.log(err);
         connection.end();
         res.send(return_data);
    });
});

显然有更优雅的方法可以做到这一点,但这很好地展示了这些概念。这两个查询是并行完成的,一旦它们都完成,我们调用最后一个函数来关闭连接并返回数据。

如果出现错误,我们会立即跳转到最后一个函数并调用它,这可能会导致我们在发送 return_data 时出现奇怪的行为,因此我不建议按原样使用此代码。

如果您想了解更多信息,请查看 async documentation .

关于mysql - 使用 node-mysql 和 ExpressJS 在一个请求中执行两个或多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29631131/

相关文章:

javascript - $http请求在Angular js中传递到服务器而不在客户端指定

node.js - 如何检查具有电子邮件的用户是否已经存在?

javascript - 如何在 Electron.js 中保存在 Canvas 上绘制的图像

node.js - NodeJS Express 和 Apache 在同一服务器上

mysql - 从 Sails 插入时在 MySQL 中未获取毫秒

php - 数据库查询失败 您的 SQL 语法有误;

mysql - 或者通过 Doctrine2 按不固定数量的关键字进行搜索

mysql - 最常见的小时查询?

javascript - JSON url 无法捕获 null 错误

node.js - 使用异步作业在 node.js/express 中正常关闭