繁体   English   中英

Socket.io +节点:TypeError:对象# <Namespace> 没有办法

[英]Socket.io + node : TypeError: Object #<Namespace> has no method

我有一个简单的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函数中保留对运算符的引用:

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

}

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

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

我的类是通过模块导出的,除了我尝试在类内使用socket.ioon方法添加侦听器时,其他所有方法都可以正常工作。 实例化类时,我已经正确使用了“ new”运算符。

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

谢谢你的时间。

当您将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()这是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM