2017-09-14 11 views
1

NodeとMySQLを使用してショッピング割り当ての一部としてJavaScriptオブジェクトを書き込もうとしています。私は関数型プログラミングよりもOOPを増やして自分自身をテストしたいと思っていました。私は、選択されたアイテム、数量、および総コストのプロパティを持つTransactionオブジェクトのコンストラクタを作成しています。また、アイテムを表示したり、アイテムを選択したり、アイテムを購入する方法もあります。Node.jsスコープとMySQLクエリ関数コールバック

始めに、ユーザーが有効な製品を選択したことを確認するユニークなitemIDの配列も必要でした。 this.ids []がオブジェクトのスコープで定義されている場合は未定義であるスコープの問題が発生しています。下の私の解決策は、スコープを避けるためにローカルでそれを定義し、その配列を引数として渡すことです。この解決策では、トランザクションオブジェクトのスコープ付き変数にアクセスすることもできません。私は

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

しようとした

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

私はTypeError: connection.query(...).call is not a function

は私がすべてを台無しに私のスコープを持っていますか取得しますか?スコープの問題を修正して、「トランザクション」オブジェクトのスコープにアクセスできるようにするにはどうすればよいですか?

は、私はここにあなたがそれが定義された場所にこれを結合し

新しいarrow機能を使用できる2つのオプションがあると信じて

+0

ようこの参照を格納?私は[Sequelize](http://sequelizejs.com)が一般的に低レベルのMySQLドライバを叩くよりもずっと優れていることを発見しました。 – tadman

答えて

0

...私の質問は、コヒーレントに言葉で表現されていない場合、私に教えてください。

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

またはいずれかの場合は、どのようなドライバを使用している

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); 
    }); 
} 
関連する問題