【问题标题】:Socket.io + node : TypeError: Object #<Namespace> has no methodSocket.io + node : TypeError: Object #<Namespace> has no method
【发布时间】:2015-03-02 13:45:59
【问题描述】:

我有一个这样的简单 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: Object #&lt;Socket&gt; has no method 'handle_msg'

我试图在函数 newClient 中保留对运算符 this 的引用:

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

 }

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

TypeError: Object #&lt;Namespace&gt; has no method 'handle_msg'

我的类是通过模块导出的,除了我尝试在类中使用 socket.ioon 方法添加侦听器时,一切正常。我在实例化我的类时正确使用了“new”运算符。

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

感谢您的宝贵时间。

【问题讨论】:

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


    【解决方案1】:

    当您将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()

    【讨论】:

    • 谢谢!!!工作!我现在明白了。问题不仅在被调用者身上,而且在调用者身上。我个人更喜欢第二种解决方案;)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多