在这个node.js函数中运行多个MySQL查询

我有这个node.js函数,它执行单个MySQL查询后返回一个Promise。

function deletePoint(PointObj, door_id) { return new Promise(function(resolve, reject) { try { var connection = jonMySQL.getMySQL_connection(); var mysql_query = '`DELETE FROM table1 WHERE user_id=? and door_id=?`'; var mysql_query_placeholder_arr = [PointObj.user_id, door_id]; connection.query(mysql_query, mysql_query_placeholder_arr, function(err, rows, fields) { if (err) { return reject(err); } else { resolve(rows); } }); } catch (err) { reject(err); } }); 

}上面的函数工作正常。 但是,如果我想要完成运行2个MYSQL查询的function呢?

第二个查询看起来像这样;

 var mysql_query2 = '`DELETE FROM table2 WHERE user_id=? and door_id=?`'; var mysql_query2_placeholder_arr = [PointObj.user_id, door_id]; 

如何将第二个MySQL查询集成到函数中,以便只有在两个查询都执行后,Promise才会返回。

编辑:这将是最好的,如果提供的答案可以处理多达几个查询(最多5)没有callback地狱。 有人可以使用asynchronous模块提供答案吗?

我build议创build一个通用的方法来执行查询,您可以根据您的要求进行修改。

注意:按顺序运行您必须pipe理您在resolve(rows)中返回的resolve(rows) 。 在并行中,所有行都以最终的successCallback result参数作为对象数组生成。

 function deletePoint(PointObj, door_id){ var query = { text : '`DELETE FROM table1 WHERE user_id=? and door_id=?`', placeholder_arr : [PointObj.user_id, door_id], }; var query2 = { text : '`DELETE FROM table2 WHERE user_id=? and door_id=?`', placeholder_arr : [PointObj.user_id, door_id], }; //do this if you want to execute the queries sequentially mySQLQuery(query).then(mySQLQuery(query2)).then(successCallback).catch(errorCallback); //do this if you want to execute the queries parallely var query_arr = [mySQLQuery(query),mySQLQuery(query2),...]; Promise.all(query_arr).then(successCallback,errorCallback) function successCallback(result){ console.log('done',result); } function errorCallback(err){ console.log('Error while executing SQL Query',err); } } function mySQLQuery(query) { var connection = jonMySQL.getMySQL_connection(); return new Promise(function(resolve, reject) { try { connection.query(query.text, query.placeholder_arr, function(err, rows, fields) { if (err) { return reject(err); } else { return resolve(rows); } }); } catch (err) { return reject(err); } }); 

另外,你总是可以使用asynchronous模块,

  • async.parallel用于并行执行,
  • 使用从一个函数传递到另一个函数的顺序执行的async.waterfall
  • async.series如果不需要在顺序函数之间传递值。

像这样尝试

 function deletePoint(PointObj, door_id) { return new Promise(function(resolve, reject) { try { var connection = jonMySQL.getMySQL_connection(); var mysql_query = 'DELETE FROM table1 WHERE user_id = ? and door_id = ?'; var mysql_query_placeholder_arr = [PointObj.user_id, door_id]; connection.query(mysql_query, mysql_query_placeholder_arr, function(err, rows1, fields) { if (err) { return reject(err); } else { var mysql_query2 = 'DELETE FROM table2 WHERE user_id = ? and door_id = ?'; var mysql_query2_placeholder_arr = [PointObj.user_id, door_id]; connection.query(mysql_query, mysql_query_placeholder_arr, function(err, rows2, fields) { if (err) { return reject(err); } else { resolve({ rows1: rows1, rows2: rows2 }); } }); } }); } catch (err) { reject(err); } }); } 

build议

在callback中编写多个查询不是更好的方法。

为了解决这种情况,使用基于场景的并行或瀑布方法的asynchronous模块