Socket.io + node:TypeError:Object#<namespace>没有方法</namespace>

时间:2015-01-05 01:57:38

标签: javascript node.js class socket.io uncaught-typeerror

我有一个简单的JavaScript类:

function MySIOClass(io)
{
    this.io = io
    this.ns = this.io.of('/notif')
    this.init()
}

MySIOClass.prototype.init = function (){
  this.ns.on('connection', this.newClient)
}

MySIOClass.prototype.newClient = function (socket)
{
  socket.on('msg', function (data){ this.handle_msg(data)})
     

}

MySIOClass.prototype.handle_msg = function (data)
{
    // handle my message
}

我卡在 newClient 函数上,每次 socket.io 客户端发送事件'msg'时,控制台触发

  

TypeError:对象#<Socket>没有方法'handle_msg'

我试图在函数 newClient 中保留运算符 this 的引用,如下所示:

MySIOClass.prototype.newClient = function (socket)
{
  var c = this;
  socket.on('msg', function (data){ c.handle_msg(data)})
     

}

但也没有运气,我得到了关于命名空间的以下错误:

  

TypeError:对象#<Namespace>没有方法'handle_msg'

我的类是通过模块导出的,除了我尝试在类中添加 方法的侦听器之外,一切正常。我在实例化课程时正确使用了“new”操作符。

你能帮我弄清楚发生了什么吗?我尝试了几件事,但都没有奏效。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

当您将this.newClient传递给.on('connection', ...)时,您只传递函数本身并丢失(this)上下文。您需要创建一个包装函数,该函数可以访问正确的上下文以正确调用newClient()或创建newClient的绑定版本。

第一个选项:

MySIOClass.prototype.init = function (){
  var self = this;
  this.ns.on('connection', function(socket) {
    self.newClient(socket);
  });
}

第二个选项:

MySIOClass.prototype.init = function (){
  this.ns.on('connection', this.newClient.bind(this));
}

关于newClient()本身内部的错误,您是正确的,因为您必须使用“self”/“that”变量来访问正确的上下文以调用handle_msg()。< / p>