使用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(); });
希望它对你有用。