socket.io中的匿名函数和闭包

时间:2014-05-22 07:09:22

标签: javascript node.js socket.io

我'有这个代码,知道需要anonymus关闭功能,但不知道它是如何工作的。如果我运行它有一个TypeError: undefined is not a function。 有人可以借助这段代码解释我的匿名闭包函数吗?

mysql= require('mysql');
var connection = mysql.createConnection({});

function check_auth(input, callback){
 var sql = "query to mysql";
connection.query(sql, function(err, results) {
    if (err) callback(err);
    if (results.length  > 0) {
        callback(null,results.values); //this is the line with error
    }else{
        callback(null, false);
    } 
  });
  };
  var io = require('socket.io').listen(5678);
  io.configure(function () {
  io.set('authorization', function(req, callback) {
    check_auth(req.query.s, function(err, result) {
        if (err) {
            return console.log('error:(');

        }
        if(result === false) {
            return callback('notauth', false);
        } else {
            return callback(null, result);;
        }
      });
    });
});

2 个答案:

答案 0 :(得分:0)

您的代码看起来不错,但代码中有错误:缺少); };

mysql= require('mysql');
var connection = mysql.createConnection({});

function check_auth(input, callback){
    var sql = "query to mysql";
    connection.query(sql, function(err, results) {
        if (err) callback(err);
        if (results.length  > 0) {
            callback(null,results.values); //this is the line with error
        }else{
            callback(null, false);
        } 
    }); // missing );
}; // missing };

io.configure(function () {
io.set('authorization', function(req, callback) {
check_auth(req.query.s, function(err, result) {
        if (err) {
            return console.log('error:(');

        }
        if(result === false) {
            return callback('notauth', false);
        } else {
            return callback(null, result);;
        }
      });
    });
});

答案 1 :(得分:0)

您的代码中似乎存在范围问题。您无法在不引用该范围的情况下从另一个范围调用函数。如果你这样做:

io.configure(function () {
  io.set('authorization', function(req, callback) {
    var check_auth = function(...) {};   // <=== local defined

    // then you can call this way
    check_auth(...);
  }
}

由于check_auth()是在外部定义的,因此io.set()的回调有自己的范围,它对check_auth()一无所知。所以你必须指向check_auth()定义的范围。像这样:

var me = this;          // <==== scope that has check_auth defined
io.configure(function () {
  io.set('authorization', function(req, callback) {

    // then you can call this way
    me.check_auth(...);
  }
}

或者您可以通过将check_auth分配给变量并在回调中调用它来执行闭包方法。像这样:

var check_auth = function(...) {};
io.configure(function () {
  io.set('authorization', function(req, callback) {

    // then you can call this way
    check_auth(...);
  }
}