节点JS等待一系列mysql查询

时间:2018-07-25 08:44:12

标签: mysql node.js rest asynchronous

我正在使用mysql和Node JS开发RESTful API。我将查询包装到定义为select函数的数据库中:

var mysql = require('mysql');

var db = mysql.createConnection({
host     : CONFIG.db_host,
user     : CONFIG.db_user,
password : CONFIG.db_password,
database : CONFIG.db_name
});

function select(query, callback, out, args) 
{
    console.log('Sent query: ' + query);
    db.query(query, args, function(err, rows){
        if(err) throw err;
        return callback(rows, out);
    });
};

为了在我的应用程序中实现一个功能,我必须对数据库表执行查询,该查询返回不确定的行数(N),并使用在每行中获得的信息来执行N new在另一个表上查询。

类似的东西:

function callback(rows, out){

    // just to give the idea ...

    for(var i=0; i<rows.length; i++)
    {
       db.select("SELECT * FROM table WHERE col=?", function(rows, out){
           out.push(rows);
       }, rows[i].col)
    }  
    // wait for all queries ...

    console.log(out)
}

out = []
db.select("SELECT * FROM table WHERE col=?", callback, out, col)

异步运行所有查询没有问题,但是在返回API响应之前,我必须等待所有查询结束。我认为使用Promises可能是一种方法,但是由于查询数量不确定,所以我不知道如何实现它。你能帮我吗?

1 个答案:

答案 0 :(得分:2)

您的主要问题是2循环。使用它意味着您正在混合同步和异步代码。

如果需要使用回调模式,建议您也使用外部库,例如async,这样可以更轻松地使用异步迭代模式。像下面这样的东西可能会解决问题:

for

如果您想改用Promise,则mysql2软件包提供与mysql类似的API,但支持promises。使用基于var async = require('async'); conn.query('SELECT * FROM table WHERE col=?', col, function (err, rows) { async.each(rows, function (row, callback) { conn.query('SELECT * FROM other_table WHERE col=?', row.col, callback); }, function () { // all queries are done }) }); 的API的有趣之处在于,您可以随后使用Promise(在Node.js async/await上),如果您不喜欢,则可以使您的生活更加轻松常规JavaScript代码的异步性质。

因此,就您而言,您将可以执行以下操作:

>= 7.6