TDN*_*169 9 mysql node.js express node-mysql
tl; dr:使用带有ExpressJS的node-mysql处理MySQL数据库的两个或多个异步查询的正确方法是什么?
我使用带有node-mysql的ExpressJS在MySQL数据库上执行两个独立的,不相关的数据库查询.由于响应是异步的,我正在嵌套查询,这意味着它们最终会一个接一个地发生.
这似乎是一种丑陋,缓慢且通常不好的方法,特别是如果我要添加第三或第四个查询.
var mysql = require('mysql');
var credentials = {...}
router.get('/api/url/', function (req, res) {
return_data = {}
var connection = mysql.createConnection(credentials);
query1 = "SELECT column1 FROM table1 WHERE column2 = 'foo'";
query2 = "SELECT column1 FROM table2 WHERE column2 = 'bar'";
connection.query(query1, {}, function(err, results) {
return_data.table1 = results;
connection.query(query2, {}, function(err, results) {
return_data.table2 = results;
connection.end();
res.send(return_data);
});
});
});
Run Code Online (Sandbox Code Playgroud)
小智 7
这是使用异步的很好的候选者.以下是使用它重构此方法的一种方法:
var mysql = require('mysql');
var async = require('async');
var credentials = {...}
router.get('/api/url/', function (req, res) {
var connection = mysql.createConnection(credentials);
var query1 = "SELECT column1 FROM table1 WHERE column2 = 'foo'";
var query2 = "SELECT column1 FROM table2 WHERE column2 = 'bar'";
var return_data = {};
async.parallel([
function(parallel_done) {
connection.query(query1, {}, function(err, results) {
if (err) return parallel_done(err);
return_data.table1 = results;
parallel_done();
});
},
function(parallel_done) {
connection.query(query2, {}, function(err, results) {
if (err) return parallel_done(err);
return_data.table2 = results;
parallel_done();
});
}
], function(err) {
if (err) console.log(err);
connection.end();
res.send(return_data);
});
});
Run Code Online (Sandbox Code Playgroud)
显然,有更优雅的方法可以做到这一点,但这很好地展示了这些概念.这两个查询是并行完成的,然后一旦完成,我们调用最后一个函数来关闭连接并返回数据.
如果有错误,我们将立即跳转到最后一个函数并调用它,这可能会导致我们发送return_data时出现奇怪的行为,因此我不建议按原样使用此代码.
如果您想了解更多信息,请查看异步文档.
小智 6
请记住,为了使查询并行运行,您必须利用连接池。在 mysql 连接上一次只能运行一个查询。有关示例,请参阅https://github.com/felixge/node-mysql/#pooling-connections。
Remyp 的答案需要修改为以下内容:
var mysql = require('mysql');
var async = require('async');
var credentials = {connectionLimit: 10,...}
router.get('/api/url/', function (req, res) {
var pool = mysql.createPool(credentials);
var query1 = "SELECT column1 FROM table1 WHERE column2 = 'foo'";
var query2 = "SELECT column1 FROM table2 WHERE column2 = 'bar'";
var return_data = {};
async.parallel([
function(parallel_done) {
pool.query(query1, {}, function(err, results) {
if (err) return parallel_done(err);
return_data.table1 = results;
parallel_done();
});
},
function(parallel_done) {
pool.query(query2, {}, function(err, results) {
if (err) return parallel_done(err);
return_data.table2 = results;
parallel_done();
});
}
], function(err) {
if (err) console.log(err);
pool.end();
res.send(return_data);
});
});
Run Code Online (Sandbox Code Playgroud)
我会评论他的帖子,但我还没有代表这样做,所以发布作为答案。
| 归档时间: |
|
| 查看次数: |
9096 次 |
| 最近记录: |