在REST API中合并2个查询的输出
我正在使用node.js restify模块。 我有一个REST API,它在json中输出单个MySQL查询的结果。 这里是API的代码;
var rest_api_get_list = function (app, url_name) { function respond(req, res, next) { var door_mac = req.query.door_mac; var connection = own_mysql.getMySQL_connection(); var query_str = "SELECT doors.mac_addr, " + "sensors.sensor_type " + "FROM sensors " + "WHERE (doors.mac_addr = ?) " ; var query_var = [door_mac]; var query = connection.query(query_str, query_var, function (err, rows, fields) { //if (err) throw err; if (err) { //throw err; console.log(err); logger.info(err); } else { res.send(rows); } }); return next(); } app.get(url_name, respond); };
假设我有另外一个类似这样的查询;
var query_str_2 = "SELECT knobs.mac_addr, " + "furniture.furniture_type " + "FROM furnitures" + "WHERE (knobs.mac_addr = ?) " ;
我想结合2个MySQL查询query_str
和query_str_2
的输出,并让REST API在json中返回结果。 如何才能做到这一点?
更清楚的是,我正在考虑这样的代码,
var rest_api_get_list = function (app, url_name) { function respond(req, res, next) { var door_mac = req.query.door_mac; var connection = own_mysql.getMySQL_connection(); var query_str = "SELECT doors.mac_addr, " + "sensors.sensor_type " + "FROM sensors " + "WHERE (doors.mac_addr = ?) " ; var query_var = [door_mac]; var query = connection.query(query_str, query_var, function (err, rows_output_1, fields) { //if (err) throw err; }); var query_str_2 = "SELECT knobs.mac_addr, " + "furniture.furniture_type " + "FROM furnitures" + "WHERE (knobs.mac_addr = ?) " ; var query_2 = connection.query(query_str_2, query_var, function (err, rows_output_2, fields) { //if (err) throw err; }); //How to display json output of rows_output_1 and rows_output_2? return next(); } app.get(url_name, respond); };
编辑:我开始赏金,以吸引使用承诺的答案。
用于pipe理asynchronous控制stream的模块(如asynchronous )可以帮助您解决这个问题。
例如:
function respond(req, res, next) { var door_mac = req.query.door_mac; var connection = own_mysql.getMySQL_connection(); var query_var = [door_mac]; async.parallel([ function (callback) { var query_str = "SELECT doors.mac_addr, " + "sensors.sensor_type " + "FROM sensors " + "WHERE (doors.mac_addr = ?) " ; connection.query(query_str, query_var, callback); }, function (callback) { var query_str_2 = "SELECT knobs.mac_addr, " + "furniture.furniture_type " + "FROM furnitures" + "WHERE (knobs.mac_addr = ?) " ; connection.query(query_str_2, query_var, callback); } ], function (error, results) { // results[0] => result for query_str // results[1] => result for query_str_2 // ... return next() or whatever }) }
如果你要求的是并行性,像@cartant所说的那样,你可以使用asynchronous或(更好的)promise( Promise.all(p1, p2).then(...)
)。
但是,如果您要求最佳方法(并行性以更多资源为代价提供更快的结果,则每个实际结果消耗的代价),您可以在一个查询中完成:
var query_str = "SELECT doors.mac_addr, " + "sensors.sensor_type as type " + "FROM sensors " + "WHERE (doors.mac_addr = ?) " + "UNION " + "SELECT knobs.mac_addr, " + "furniture.furniture_type as type " + "FROM furnitures" + "WHERE (knobs.mac_addr = ?) " ;
这样,你执行单一的数据库调用,当然,数据库不会执行任何并行操作,相反,它将尽最大努力在较低的资源消耗下得到最好的答案。
所以,如果你不得不出席更多的请求,平均效率会更好,另一方面,如果你要求在资源不多的环境下取得更快的结果,那么平行的方法会更好。