Socket.io未被捕获的TypeError:无法读取未定义的属性“ apply”

时间:2018-11-15 02:09:29

标签: javascript socket.io

在我使用socket.io的程序中,特定事件不起作用。其余的工作正常。这是发生问题的地方:

第一个html文件:

 socket.on('connect', () => {socket.emit('phone', 'phone');});

服务器文件:

io.on('connection', function(socket){ 
   io.on('phone', function(socket, data){ 
      io.emit('stuurbedrijfsnaam', 'stuurbedrijfsnaam'); 
   }); 
});

第二个html文件:

socket.on('stuurbedrijfsnaam', function(socket){
    socket.emit('stuurbedrijfsnaam',bedrijfsnaam) 
})

这是控制台中给出的完整错误:

index.js:83 Uncaught TypeError: Cannot read property 'apply' of undefined
at r.emit (index.js:83)
at r.onevent (index.js:83)
at r.onpacket (index.js:83)
at r.<anonymous> (index.js:83)
at r.emit (index.js:83)
at r.ondecoded (index.js:83)
at a.<anonymous> (index.js:83)
at a.r.emit (index.js:83)
at a.add (index.js:83)
at r.ondata (index.js:83)
at r.<anonymous> (index.js:83)
at r.emit (index.js:83)
at r.onPacket (index.js:83)
at r.<anonymous> (index.js:83)
at r.emit (index.js:83)
at r.onPacket (index.js:83)
at r.onData (index.js:83)
at WebSocket.ws.onmessage (index.js:83)

它引用index.js:83,它位于socket.io本身创建的文件夹中。有81、82和83行:

Backoff.prototype.setJitter = function(jitter){
    this.jitter = jitter;
    };

希望我给了足够的资源。如果有人帮助我,那将很酷。谢谢!

2 个答案:

答案 0 :(得分:3)

此错误的原因是,您正在尝试根据自定义事件处理程序的.emit()参数which is incorrect usage调用socket,具体方法取决于socket.io客户端的文档API。

考虑如下修改客户端代码,方法是从处理程序中删除socket参数,以使.emit()在实际的套接字实例上被调用:

socket.on('stuurbedrijfsnaam', function(){ // remove 'socket' here

   // cause emit() to be called on actual socket instance
   socket.emit('stuurbedrijfsnaam',bedrijfsnaam) 
})

第一个html文件中的socket.emit('phone', 'phone');的原因是emit()是在原始套接字实例上调用的,而不是通过传递给事件处理程序的socket参数来完成的在您的秒html文件中。

希望有帮助!

答案 1 :(得分:1)

对于任何搜索此错误的人。这可能是由于在.on方法中提供未定义的变量作为第二个参数而引起的。 socket.io的内部代码尝试调用.apply方法来将参数传递到事件处理程序中。如果注册的函数不存在,因此undefined不存在,则将发生此错误,因为未定义的值没有这样的属性。函数名称中经常出现错字

socket.on('next_player', this.nextplayer)

应为:

socket.on('next_player', this.next_player)