2013-11-22 62 views
1

我是javascript中的begginer。我嘗試編寫一個用於Express和node-mysql的模型。它定義了類的地方。
當我創建一個對象實例:var p = new Place(10);它應該初始化對象並填充它的變量。但初始化數據存儲在數據庫中,並且查詢是異步的,因此我認爲該對象是首先創建的,我不知道從數據庫返回的數據以及如何正確初始化對象實例變量會發生什麼。模型對象構造函數中的node-mysql查詢

var db = app.db; // app is set as GLOBAL 

// constructor 
var Place = function(place_id) { 
    this.getPlaceById.call(place_id, function(err, result){ 
     if (err) throw err; 

     this.id = result.id; 
     this.title = result.title; 
     this.city = result.city; 
     this.address = result.address; 
    }); 
} 

Place.prototype.getPlaceById = function (place_id, callback) { 
    db.query(
     'call getPlaceById(?);', /* call stored procedure */ 
     [ place_id ], 
     function(err, results, fields) { 
      if(err) { 
       callback(err); 
      } else { 
       callback(null, results[0][0]); 
      } 
     } 
    ); 
} 

module.exports = Place; 

至於結果我有一個奇怪的錯誤:

function(place_id) { 
... 
} has no method 'replace' 
    at Object.SqlString.escape (.../node_modules/mysql/lib/protocol/SqlString.js:40:13) 
    at .../node_modules/mysql/lib/protocol/SqlString.js:72:22 
    at String.replace (native) 

,如果我離開空的構造和只要致電:

p.getPlaceById(10, function(err,r) { 
    console.log(r) 
}); 

它的工作原理沒有錯誤,並返回正確的數據。

回答

0

我找到了解決辦法:

var Place = function(place_id, fn) { 
    var self = this; 

    Place.prototype.getPlaceById.call(this, place_id, function(err, result){ 
     if (err) { 
      fn.call(self, err) 
     } 
     else { 
      self.id = result.id; 
      self.title = result.title; 
      self.city = result.city; 
      self.address = result.address; 

      fn.call(self); 
     } 
    }); 
} 

並創建一個對象實例,以便:

var p = new Place(place_id,function(err,result){ 
    if (err) 
     console.log(err) 
    else 
     console.log(p); 
});