使用mysql在节点js中嵌套查询

时间:2015-03-30 11:20:38

标签: mysql node.js

我正在尝试使用mysql在节点js处跟踪代码但是收到错误“在调用quit后无法将查询排入队列。

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(); 

3 个答案:

答案 0 :(得分:7)

我在你的代码中看到两个问题:

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

要完成您尝试执行的操作,您必须考虑这些异步方案。您可以使用promises或类似async的模块,它为您提供了许多方法来处理同步流,例如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()

答案 1 :(得分:4)

删除连接结束功能

==> connection.end();

答案 2 :(得分:1)

在您的查询尚未完成之前,问题是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();
});

希望它对你有用。