在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_strquery_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); }; 

编辑:我开始赏金,以吸引使用承诺的答案。

       

网上收集的解决方案 "在REST API中合并2个查询的输出"

用于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 = ?) " ; 

这样,你执行单一的数据库调用,当然,数据库不会执行任何并行操作,相反,它将尽最大努力在较低的资源消耗下得到最好的答案。

所以,如果你不得不出席更多的请求,平均效率会更好,另一方面,如果你要求在资源不多的环境下取得更快的结果,那么平行的方法会更好。