2014-01-22 36 views
0

我使用Node.js與socket.io和node-mysql。 我有一個用戶類來登錄和操作用戶。 在構造函數中,我向db查詢。這個關鍵字範圍和對象返回

function user(u,pass,connection,callback){ 
    connection.query("SELECT * FROM `users` WHERE `username`=? && `password`= ? LIMIT 1",[u,pass], function(err,result) 
    if(err){ 
     console.log(err); 
     this.id = false; 
    } 
    else { 
     if(result.length > 0){ 
      var row = result[0]; 
      this.socket = null; 
      this.id = row.id; 
      this.inuse = null; 
     } 
     else 
      this.id=false; 
    } 
    callback(this); 

    }); 
} 

我必須做一個回調函數,因爲查詢數據庫是異步的。但是,當我使用這個關鍵詞時,我將屬性追加到連接實例而不是我創建的新對象。 此外,當我將這個關鍵字傳遞給回調傳遞'連接'而不是'用戶',所以我沒有我的對象。 有人知道這個問題的解決方案嗎?

我使用這樣的

 user_fac(username,password,connection, function(u){ 
      console.log(u); 
      if(u.id){ 
       clients[u.id] = u; 

      } 
      else { 
       //throw error 
      } 
     }); 
+0

什麼對象?爲什麼'this'不是連接? – adeneo

回答

0

我猜你指的是user()函數的對象,你可以從一個變量另一個範圍存儲this和補充。

function user(u,pass,connection,callback){ 
    var self = this; 

    connection.query("SELECT * FROM `users` WHERE `username`=? && `password`= ? LIMIT 1",[u,pass], function(err,result) 
     if(err){ 
      console.log(err); 
      self.id = false; 
     } else { 
      if(result.length > 0){ 
       var row = result[0]; 
       self.socket = null; 
       self.id = row.id; 
       self.inuse = null; 
      } else { 
       self.id=false; 
      } 
     } 
     callback(self); 
    }); 
} 
0

把它藏在手邊。

function user(u,pass,connection,callback){ 
    var that = this /// <---- stash it in the closure 

    connection.query("SELECT * FROM `users` WHERE `username`=? && `password`= ? LIMIT 1",[u,pass], function(err,result) { 
    if(err){ 
     console.log(err); 
     that.id = false; // <----- use that instead of this 
    } else { 
     if(result.length > 0){ 
      var row = result[0]; 
      that.socket = null; 
      that.id = row.id; 
      that.inuse = null; 
     } 
     else { 
      that.id=false; 
     } 
    callback(that); 

    }); 
}