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

我正在尝试下面的代码在节点js使用mysql,但得到错误“不能入队查询调用退出后。

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

删除连接结束function

==> connection.end();

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

  • 你同时调用connection.end() ,但你的查询运行在asynchronousstream程中。 只有在完成第二个查询后,才必须调用connection.end()
  • 你正在使用一个普通的for循环来运行assync调用(你outter循环)。

为了完成你想要做的事情,你必须考虑那些同步场景。 你可以使用promises或像async这样的模块,它提供了很多方法来处理assyncronousstream,比如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()将只在您的所有查询完成时被调用。

问题是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(); }); 

希望它对你有用。