2016-10-06 1 views
1

Ich habe diese Funktion node.js, die ein Versprechen nach dem Ausführen einer einzelnen MySQL-Abfrage zurückgibt.Führen Sie mehrere MySQL-Abfragen in dieser Funktion node.js

} Die obige Funktion funktioniert gut. Was aber, wenn ich möchte, dass die Funktion 2 MYSQL-Abfragen beendet?

Die zweite Abfrage würde in etwa so aussehen;

Wie integriere ich diese zweite MySQL-Abfrage in die Funktion, sodass die Promise erst zurückkehrt, nachdem beide Abfragen ausgeführt wurden?

EDIT: Es wäre vorzuziehen, wenn die zur Verfügung gestellte Antwort mehrere Anfragen (sagen wir bis zu 5) ohne Callback-Hölle behandeln kann. Kann jemand eine Antwort mit einem asynchronen Modul geben?

+0

Sie können zweite Abfrage im ersten Rückruf schreiben und dann – abdulbarik

Antwort

2

würde ich vorschlagen, eine allgemeine Methode zum Erstellen von Abfragen auszuführen, können Sie es nach Ihren Anforderungen ändern.

Hinweis: fortlaufend müssen Sie die Zeile verwalten, die Sie in resolve(rows) zurückgeben. Parallel werden alle Zeilen im letzten successCallback result Parameter als Array von Objekten erzeugt.

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

Außerdem können Sie immer async Modul verwenden,

  • async.parallel für die parallele Ausführung,
  • async.waterfall für sequentielle Ausführung mit Werten von einer Funktion zur anderen weitergegeben oder
  • async.series wenn keine Werte müssen zwischen sequentiellen Funktionen übergeben werden.
+0

Nivesh, Verified, um die richtige Antwort zu sein. Einige Änderungen an Ihrem Code mit Syntaxfehlern vorgenommen. Bitte genehmigen. Vielen Dank. – user781486

+1

Ich würde vorschlagen, eher, dass die Verbindung jedes Mal, wenn Sie mySQLQuery-Funktion aufrufen, versuchen, Verbindung [Pooling] (https://www.npmjs.com/package/mysql#pooling-connections) zu implementieren. Sehen Sie sich an, wie ich den Code bei der Verwendung von PostgreSQL [myRepo] strukturiert habe (https: // github.com/nivesh2/DaysNote/Blob/Master/Server/Funktionen/Datenbank/dbAccess.js). – Nivesh

+0

Darf ich fragen, was ist der Vor- und Nachteil, wenn überhaupt, Verbindungspooling im Vergleich zu dem Erstellen der Verbindung bei jedem Aufruf der MySQLQuery-Funktion zu verwenden? – user781486

1

Versuchen Sie, wie dieses

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

Anregung

Es ist nicht der bessere Ansatz mehrere Abfragen in einem Rückruf zu schreiben.

Um eine solche Art der Fall Verwendung async Modul mit parallel oder waterfall Methoden zu lösen basierend auf Szenario

+0

Danke zurückgeben. Upvoted. Es besteht die hohe Wahrscheinlichkeit, dass diese Funktion mehrere Abfragen umfasst. Ich befürchte, dass der Code ziemlich hässlich werden kann, wenn die Funktion beispielsweise 5 Abfragen verarbeiten muss. – user781486

+0

Ich empfahl, Async-Modul verwenden, die eine bessere Möglichkeit hat, solche Art von Fall zu beheben https://github.com/caolan/async – abdulbarik

Verwandte Themen