返回此关键字范围和对象

时间:2014-01-22 17:04:41

标签: javascript node.js

我正在使用带有socket.io和node-mysql的Node.js. 我有一个用户类来登录和操纵用户。 在构造函数中,我对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);

    });
}

我必须创建一个回调函数,因为对db的查询是异步的。但是,当我使用这个关键词时,我将属性附加到连接实例,而不是我创建的新对象。 另外,当我将this关键字传递给回调时,传递'连接'而不是'用户',所以我没有我的对象。 有人知道这个问题的解决方案吗?

我像这样使用它

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

            }
            else {
                //throw error
            }
        });

2 个答案:

答案 0 :(得分: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);
    });
}

答案 1 :(得分: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);

  });
}