2016-04-16 2 views
0

Hier ist mein Code:wo schließe ich die Verbindung in node-mysql?

var set = { 
       FIRST_NAME: professor.value_20, 
       SURNAME: professor.value_21 
      } 
      //logs 
      //console.log(set); 
      //executes query 
      connection.query({ 
       sql: 'SELECT TEACHERID FROM TEACHER WHERE FIRST_NAME = ? AND SURNAME = ?', 
       //'INSERT INTO TEACHER set ? ON DUPLICATE KEY UPDATE FIRST_NAME = ?, SURNAME = ?', 
       values: [set.FIRST_NAME,set.SURNAME] 
      }, (err, results, fields) => { 
       if (err) throw err; 

       if(results.length < 0) { 
        connection.query({ 
         sql: 'INSERT INTO TEACHER set ?', 
         values: [set] 
        }, (err, results, fields) => { 
         if (err) throw err; 

        }); 
       } 
       else { 
        connection.query({ 
         sql: 'UPDATE TEACHER (FIRST_NAME, SURNAME) VALUES(?,?)', 
         values: [set.FIRST_NAME, set.SURNAME] 

        }, (err, results, fields) => { 
         if (err) throw err; 
         connection.end(); 
        }); 
       } 

      }); 

Wenn ich diesen Code ausführen ich die folgende Fehlermeldung erhalten:

Error: Cannot enqueue Query after invoking quit. 

Das Problem auf der Ebene der dritten Abfrage vorzukommen scheint, obwohl ich nicht in der Nähe tat die Verbindung früher. Wie behebe ich das?

Eine andere Frage: ist es in diesem Fall besser, einen Pool anstelle einer direkten Verbindung zu verwenden?

Vielen Dank!

Antwort

0

How do I fix this?

Sie müssen entweder connection.end() entfernen oder die Verbindung vorher wiederherzustellen.

var connection = mysql.createConnection(config); //establish new connection 
connection.query({ 
    sql: 'SELECT TEACHERID FROM TEACHER WHERE FIRST_NAME = ? AND SURNAME = ?', 
    //'INSERT INTO TEACHER set ? ON DUPLICATE KEY UPDATE FIRST_NAME = ?, SURNAME = ?', 
    values: [set.FIRST_NAME, set.SURNAME] 
}, (err, results, fields) => { 
    if (err) throw err; 

    if (results.length < 0) { 
    connection.query({ 
     sql: 'INSERT INTO TEACHER set ?', 
     values: [set] 
    }, (err, results, fields) => { 
     if (err) throw err; 

    }); 
    } else { 
    connection.query({ 
     sql: 'UPDATE TEACHER (FIRST_NAME, SURNAME) VALUES(?,?)', 
     values: [set.FIRST_NAME, set.SURNAME] 

    }, (err, results, fields) => { 
     if (err) throw err; 
     connection.end(); //or just remove this line 
    }); 
    } 

}); 

Ich empfehle die obigen Fixes nicht. Die beste Lösung ist die Verwendung von Pooling-Verbindungen.

pool.getConnection(function(er,connection){ 
    if(er){ 
     throw er; 
    } 
    connection.query({ 
     sql: 'SELECT TEACHERID FROM TEACHER WHERE FIRST_NAME = ? AND SURNAME = ?', 
     //'INSERT INTO TEACHER set ? ON DUPLICATE KEY UPDATE FIRST_NAME = ?, SURNAME = ?', 
     values: [set.FIRST_NAME, set.SURNAME] 
    }, (err, results, fields) => { 
     if (err) throw err; 

     if (results.length < 0) { 
     connection.query({ 
      sql: 'INSERT INTO TEACHER set ?', 
      values: [set] 
     }, (err, results, fields) => { 
      if (err) throw err; 

     }); 
     } else { 
     connection.query({ 
      sql: 'UPDATE TEACHER (FIRST_NAME, SURNAME) VALUES(?,?)', 
      values: [set.FIRST_NAME, set.SURNAME] 

     }, (err, results, fields) => { 
      if (err) throw err; 
     }); 
     } 

    }); 
}); 

Dieser Ansatz wird den Overhead zum Erstellen einer neuen Verbindung in jeder Abfrage entfernen.

Verwandte Themen