2017-02-01 7 views
0

Ich bin eine API implementieren, um eine MySQL-Datenbank von Nodejs zu verwalten, und ich möchte meinen Code sauber zu halten, da die Arbeit, die ich vorhabe, eine Menge verschachtelte connection.query Funktionen überall haben kann der Ort, also habe ich beschlossen, so viele Fragen wie möglich in separate Funktionen zu trennen.Javascript versprechen mit MySQL

starten ich eine Funktion zu prüfen, ob ein vorhandenes Element bereits auf dem Tisch, wie dies tun wollte:

var insert = function (item, done) { 
    validator(item).then(function(err,done) { 
     console.log('here I go: '+done); 
     if(done) { 
      console.log('good'); 
     } else{ 
      console.log('bad') 
     } 
    ); 
    } 
: wie diese

function validator(item) { 
    return new Promise(function(err,done) { 
    connection.query('select * from items where item_id = ?', [item.id] , function(err,rows){ 
     console.log(rows); 
     console.log("above row object"); 
     if (err) { 
      return done(false); 
     } 
     if (rows.length) { 
      console.log('That item is already in the DB.'); 
      return done(false); 
     } else { 
      console.log('That item is new.'); 
      return done(true); 
     } 
    }); 
}); 
} 

Und dann will ich es benutzen

Aber es funktioniert nicht wie ich erwartet habe, die erste Funktion erkennt genau, ob ein Element existiert oder nicht, aber die zweite Funktion erreicht niemals den "here I go" -Druck.

Ich habe Use promise to process MySQL return value in node.js geprüft, Javascript Promise node.js? und Javascript & promises with Q - closure problems in promises aber die conclussion I erreichen, dass dies ein klassisches PEBCAK Problem ist, wie, dass ich ein sehr inkompetent JavaScript-Programmierer bin und wickeln kann meinen Kopf nicht um die Rückrufe und verspricht alle so gut, dass ich sie in die falsche Richtung führe.

+0

'return new Promise (Funktion (err, done) {'? So funktioniert das nicht. –

Antwort

1

Der erste Rückruf, den Sie an die Promise constructor übergeben, ist nicht der Fehler.

ändern

return new Promise(function(err,done) { 

in

return new Promise(function(done, reject) { 

und es so nennen:

validator(item).then(function(done) { 

(die übrigens sehr verwirrend es ist done beide Rückruf, um die Entschlossenheit zu rufen und das Ergebnis).

Behandeln Sie die eingehenden Fehler: Ändern

if (err) { 
     return done(false); 
} 

in

if (err) { 
     reject(err); 
} 

und vergessen Sie nicht, diese Fehler zu fangen.

Auch dies liegt wahrscheinlich außerhalb des Geltungsbereichs dieser QA, aber normalerweise werden Verbindungen hergestellt und freigegeben. Sie sollten sich wahrscheinlich die mysql-Treiber für Versprechungen ansehen.

+0

Das scheint mir geholfen zu haben, aber jetzt meine print console.log ('hier gehe ich:' + done); immer sagt mir "hier gehe ich undefiniert", sollte nicht "fertig" sein, wie die Rückkehr auf den Rückruf, wenn ein Element nicht existiert? Auch ja, ich weiß, ich muss die Verbindungen freigeben, das ist nur ein kleiner Test von Konzept. –

+0

@DanielOrtiz ich ein paar andere Probleme hinweisen, bearbeitet werden. Und ich schlage vor, Umbenennen, dass „done“. –

+0

Danke sehr, Ihre Zeiger hat mir geholfen, das Problem zu lösen, in der Tat war der letzte Teil ein Produkt von mir müde als Ich habe validator (item) .then (function (err, done) {anstelle von validator (item) .dann (function (done, err) {und als solches war das 'done' nicht definiert. –