2013-04-21 18 views
5

Alles, was ich tun möchte, ist einige Daten einfügen, wenn meine Datenbank das nicht hat, so setze ich Insert SQL in meine Callback-Funktion meiner Select SQL, aber ich habe Fehler dies wie:Node.js und mysql Callback: Abfrage in Abfrage Callback

{ [Error: Cannot enqueue Query after invoking quit.] code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }

mein Code-Schnipsel ist hier:

db.query('SELECT count(*) as Resultcount FROM tablename WHERE email = ? and password = ?', [post.email, post.password], function(error, result){ 
    if (result[0].Resultcount == 0){ 
     var query2 = db.query('INSERT INTO tablename SET ?', [post], function(err, result) { 
      if(err){ 
       console.log(err); 
      } 
      console.log(result); 
      }); 
    } 
    else{ 
     console.log('have data already'); 
    } 
}); 

Könnte jemand mir einen Rat geben? Dank

---- ---- Update

tatsächlich, die Callback-Funktion von ausgewählten SQL ist nicht eine anonyme Funktion, mein Code-Schnipsel über db.end() ist wie folgt:

var QueryResults = new queryResultFuntion(Back_results); 

    db.query('SELECT count(*) as Resultcount FROM tablename WHERE email = ? and password = ?', [post.email, post.password], QueryResults.queryResult); 


    db.end(); 
+0

Schließen Sie Ihre DB-Verbindung irgendwo nach diesem Code? – loganfsmyth

+0

Ja, wenn ich db.query ('select ...') beende, habe ich db.end(); – Arvin

+0

Das bedeutet, dass zu dem Zeitpunkt, zu dem Ihre INSERT-Abfrage ausgeführt wird, die Verbindung geschlossen wird. Bitte fügen Sie diesen Code zu Ihrer Frage hinzu und ich werde eine Antwort geben. – loganfsmyth

Antwort

14

Sie db.end() Anruf die Verbindung wird Warteschlange, sobald die SELECT hat zu schließen abgeschlossen, so dass, wenn Sie die innere INSERT Abfrage zu tun versuchen, wird die Datenbankverbindung geschlossen wurden, damit der Fehler PROTOCOL_ENQUEUE_AFTER_QUIT, wie Sie versuchen, eine neue Schlange Befehl nach dem Schließen der Verbindung.

Je nachdem, wie Sie die Verbindung erstellen, sollten Sie entweder Ihren db.end() Anruf in die Rückrufe verschieben oder keinen db.end() Anruf haben, wenn die Verbindung beim Programmstart geöffnet wird.

+0

Wenn ich 'db.end()' überhaupt nicht mache, muss ich mein Skript (das ich in der Befehlszeile mit dem 'node' Befehl starte) mit Ctrl-C beenden. Aber das hat 'PROTOCOL_ENQUEUE_AFTER_QUIT' – Lori

+2

@Lori Korrigiert, deshalb habe ich es mit' Je nachdem, wie Sie die Verbindung erstellen 'vorangestellt. Wenn Sie beispielsweise einen Node-Server schreiben, würden Sie die Verbindung nur einmal öffnen, und es besteht keine Erwartung, dass der Server trotzdem jeden Exit ausführen würde. Wenn Sie ein Skript schreiben, sollten Sie die Verbindung beenden, sobald alle Vorgänge in Ihrem Skript abgeschlossen sind. – loganfsmyth

Verwandte Themen