2016-10-06 2 views
1

У меня есть эта функция node.js, которая возвращает Promise после выполнения одного запроса MySQL.Запуск нескольких запросов MySQL в этой функции node.js

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 в функцию таким образом, что обещание будет возвращать только после того, как оба запроса были выполнены?

EDIT: Было бы предпочтительнее, если предоставленный ответ может обрабатывать до нескольких запросов (скажем, до 5) без обратного ад. Может ли кто-нибудь дать ответ, используя асинхронный модуль?

+0

Вы можете написать второй запрос в обратном вызове первого и вернуть затем – abdulbarik

ответ

2

Я хотел бы предложить создать обобщенный метод для выполнения запросов, вы можете изменить его в соответствии с вашими требованиями.

Примечание: выполняется последовательно, вы должны управлять строкой, возвращаемой в resolve(rows). Параллельно все строки получаются в конечном успехеCallback 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, если нет значений должны быть переданы между последовательными функциями.
+0

Nivesh, Проверено, будет правильным ответом. Сделал некоторые изменения для вашего кода, который имеет некоторую синтаксическую ошибку. Пожалуйста подтвердите. Благодарю. – user781486

+1

Я бы предположил, что, создавая соединение каждый раз, когда вы вызываете функцию mySQLQuery, вы должны попробовать реализовать соединение [объединение] (https://www.npmjs.com/package/mysql#pooling-connections). Посмотрите, как я структурировал код при использовании PostgreSQL [myRepo] (https: // github.ком/nivesh2/DaysNote/BLOB/Master/сервер/функция/базы данных/dbAccess.js). – Nivesh

+0

Могу ли я спросить, в чем преимущество и недостаток, если таковые имеются, использования пула соединений и создания соединения каждый раз, когда вызывается функция MySQLQuery? – user781486

1

Попробуйте как этот

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 модуля с parallel или waterfall методов, основанных на сценариях

+0

Спасибо. Upvoted. Существует высокая вероятность того, что эта функция будет расширяться, чтобы охватить несколько запросов. Я боюсь, что код может вырасти, чтобы стать довольно уродливым, если функция должна обрабатывать, скажем, 5 запросов. – user781486

+0

Я рекомендовал использовать модуль 'async', который имеет лучший способ разрешить такой случай. Https://github.com/caolan/async – abdulbarik

Смежные вопросы