2017-09-14 4 views
1

Ich versuche, ein JavaScript-Objekt als Teil einer Einkaufsaufgabe mit Knoten und MySQL zu schreiben. Ich wollte mich selbst testen, indem ich mehr OOP als funktionale Programmierung mache. Ich erstelle einen Konstruktor für ein Transaction-Objekt mit den Eigenschaften für ausgewählten Artikel, gewünschte Menge und Gesamtkosten. Auch wären die Methoden zum Anzeigen von Artikeln, Auswählen von Artikeln und Kauf von Artikeln.Scoping mit Node.js und der MySQL-Abfrage Funktion Rückruf

Am Anfang wollte ich auch eine Reihe einzigartiger itemIDs haben, die die Verifizierung darstellen würden, dass ein Benutzer ein gültiges Produkt auswählte. Ich habe ein Scoping-Problem, bei dem this.ids [] nicht definiert ist, wenn es im Bereich des Objekts definiert ist. Meine Lösung wäre, sie lokal zu definieren und dieses Array als Argumente zu übergeben, um Scoping zu vermeiden. Diese Lösung würde es mir auch nicht erlauben, auf die Bereichsvariablen des Transaktionsobjekts zuzugreifen.

this.listProducts = function(connection) { 
    connection.query("SELECT * FROM products WHERE stock_quantity>0", function(err,res) { 
     if (err) throw err; 
     this.ids = []; 
     for (var i = 0; i < res.length; i++) { 
      this.ids.push(res[i].item_id); 
      console.log(res[i].item_id + " " + res[i].product_name + " " + res[i].price); 
     } 
     // res.forEach(function (element) { 
     // console.log("this.ids=",this.ids); 
     // this.ids.push(element.item_id); 
     // console.log(element.item_id + " " + element.product_name + " " + element.price); 
     // }); 
     connection.end(); 
     console.log(this.totalCost, this.ids); 
    }); 
}; 

Ich versuchte

  .... 
     console.log(this.totalCost, this.ids); 
    }); 
}.call(this); 

I TypeError: connection.query(...).call is not a function bekommen

habe ich meine Scoping alle vermasselt? Wie kann ich das Scoping-Problem beheben, damit ich auf den Bereich "Transaction" zugreifen kann?

Lassen Sie mich wissen, wenn meine Frage schlüssig nicht formuliert ist ...

+0

Welche Treiber verwenden Sie, wenn überhaupt? Ich habe festgestellt, [Sequelize] (http://seququelizejs.com) ist in der Regel viel besser als gegen die Low-Level-MySQL-Treiber zu schlagen. – tadman

Antwort

0

Ich glaube, es gibt zwei Möglichkeiten Sie

die neue arrow Funktion, die diese bindet verwenden können, wo immer sie definiert wurde.

this.listProducts = function(connection) { 
    var that = this; 
    connection.query("SELECT * FROM products WHERE stock_quantity>0", 
    //use arrow instead of anonymous function 
    (err,res) => { 
     if (err) throw err; 
     this.ids = []; 
     for (var i = 0; i < res.length; i++) { 
      this.ids.push(res[i].item_id); 
      console.log(res[i].item_id + " " + res[i].product_name + " " + res[i].price); 
     } 
     connection.end(); 
     console.log(this.totalCost, this.ids); 
    }); 
} 

oder speichern die diese Referenz wie

this.listProducts = function(connection) { 
    var that = this; 
    connection.query("SELECT * FROM products WHERE stock_quantity>0", function(err,res) { 
     if (err) throw err; 
     that.ids = []; 
     for (var i = 0; i < res.length; i++) { 
      that.ids.push(res[i].item_id); 
      console.log(res[i].item_id + " " + res[i].product_name + " " + res[i].price); 
     } 
     connection.end(); 
     console.log(that.totalCost, that.ids); 
    }); 
}