运行 此 node.js 函数中的多个 MySQL 查询

Run multiple MySQL queries in this node.js function

我有这个 node.js 函数,它在执行单个 MySQL 查询后 return 是一个 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 个查询怎么办?

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

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

如何将第二个 MySQL 查询集成到函数中,以便 Promise 仅在两个查询都已执行后才会 return?

编辑:如果提供的答案可以处理最多多个查询(比如最多 5 个)而没有回调地狱,那将是更可取的。有人可以使用异步模块提供答案吗?

这样试试

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

建议

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

要解决此类案例,请根据场景

使用 async module with parallel or waterfall 方法

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

注意: 运行 您必须按顺序管理您在 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);
    }
});

此外,您可以随时使用 async 模块,

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