【问题标题】:Nested query in node js using mysql使用 mysql 在节点 js 中嵌套查询
【发布时间】:2015-06-03 09:21:31
【问题描述】:

我正在使用 mysql 在节点 js 上尝试以下代码,但出现错误“调用退出后无法排队查询。

var mysql = require('mysql');

var connection = mysql.createConnection({
host     : 'localhost',
user     : 'USER',
password : 'PASS',
database : 'DB',
});

connection.connect();

var queryString = 'SELECT * FROM tbl_product';

connection.query(queryString, function(err, rows, fields) {
    if (err) throw err;
    for (var i in rows) {
        console.log('Product Name: ', rows[i].product_name);
        var emp_query = 'SELECT * FROM tbl_employer';
        connection.query(queryString, function(emp_err, emp_rows, emp_fields) {
            if (emp_err) throw emp_err;
            for (var e in emp_rows) {
                console.log('Employer Name: ', emp_rows[e].company_name);
            }
        }); 
    }
});  
connection.end(); 

【问题讨论】:

    标签: mysql node.js


    【解决方案1】:

    我在您的代码中发现了两个问题:

    • 您正在同步调用connection.end(),但您的查询在异步流中运行。只有在完成第二个查询后,您才需要致电 connection.end()
    • 您正在使用常规 for 循环来运行异步调用(外部循环)。

    要完成您想要做的事情,您必须考虑那些异步场景。您可以使用promisesasync 之类的模块,它为您提供了很多处理异步流的方法,例如async.each()

    connection.query(queryString, function(err, rows, fields) {
        if (err) throw err;
    
        async.each(rows, function (row, callback) {
            console.log('Product Name: ', row.product_name);
            var emp_query = 'SELECT * FROM tbl_employer';
            connection.query(queryString, function(emp_err, emp_rows, emp_fields) {
                if (emp_err) callback(emp_err);
                for (var e in emp_rows) {
                    console.log('Employer Name: ', emp_rows[e].company_name);
                }
                callback();
            }); 
        });
        }, function (err) {
            connection.end();
        }
    });
    

    现在它将保证在您完成所有查询后才调用connection.end()

    【讨论】:

      【解决方案2】:

      删除连接结束功能

      ==> connection.end();

      【讨论】:

        【解决方案3】:

        问题是在您的查询尚未完成之前触发connection.end()。尝试将connection.end() 放在外循环的末尾。

        connection.query(queryString, function(err, rows, fields) {
            if (err) throw err;
            for (var i in rows) {
                console.log('Product Name: ', rows[i].product_name);
                var emp_query = 'SELECT * FROM tbl_employer';
                connection.query(queryString, function(emp_err, emp_rows, emp_fields) {
                    if (emp_err) throw emp_err;
                    for (var e in emp_rows) {
                        console.log('Employer Name: ', emp_rows[e].company_name);
                    }
                }); 
            }
            connection.end();
        });
        

        希望对你有用。

        【讨论】:

        • 查询是异步的,所以即使将 connection.end() 放在 for 循环之后也不能解决问题
        猜你喜欢
        • 1970-01-01
        • 2020-08-21
        • 2018-03-25
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 2022-12-06
        相关资源
        最近更新 更多