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

使用节点mysql和ExpressJS在一个请求中执行两个或多个查询,mysql,node.js,express,node-mysql,Mysql,Node.js,Express,Node Mysql,tl;dr:使用带有ExpressJS的节点MySQL处理对MySQL数据库的两个或多个异步查询的正确方法是什么 我使用带有节点mysql的ExpressJS在mysql数据库上执行两个独立的、不相关的数据库查询。因为响应是异步的,所以我嵌套查询,这意味着它们最终会一个接一个地发生 这似乎是一种丑陋、缓慢且通常很糟糕的方法,尤其是如果我要添加第三个或第四个查询 var mysql = require('mysql'); var credentials = {...} router.g

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

我使用带有节点mysql的ExpressJS在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);
        });
    });
});

这是一个非常适合使用的候选者。这里有一种方法可以使用它重构:

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_数据时出现奇怪的行为,因此我不建议按原样使用此代码


如果您想了解更多信息,请查看。

请记住,为了使查询并行运行,您必须利用连接池。在mysql连接上一次只能运行一个查询。有关示例,请参见

Remyp的答案需要修改为以下内容:

var mysql      = require('mysql');
var async      = require('async');
var credentials = {connectionLimit: 10,...}

router.get('/api/url/', function (req, res) {
    var pool = mysql.createPool(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) {
           pool.query(query1, {}, function(err, results) {
               if (err) return parallel_done(err);
               return_data.table1 = results;
               parallel_done();
           });
       },
       function(parallel_done) {
           pool.query(query2, {}, function(err, results) {
               if (err) return parallel_done(err);
               return_data.table2 = results;
               parallel_done();
           });
       }
    ], function(err) {
         if (err) console.log(err);
         pool.end();
         res.send(return_data);
    });
});
我会对他的帖子发表评论,但我还没有代表这样做,所以作为一个答案发布

来自:

出于安全目的,默认情况下禁用执行多个语句查询。要使用多语句查询,应在创建连接时首先启用它,如下所示

var connection =  mysql.createConnection( { multipleStatements: true } );
启用后,您可以在connection.query中执行多个语句查询,如下所示

connection.query('select column1; select column2; select column3;',    
function(err, result){
  if(err){
      throw err;
  }else{
      console.log(result[0]);       // Column1 as a result
      console.log(result[1]);       // Column2 as a result
      console.log(result[2]);       // Column3 as a result
  }
});

在这种情况下,并行_作为回调执行是什么?