使用Express开发带聊天系统的Node应用时遇socket.io报错:socket.on不是函数
解决Socket.IO中
TypeError: socket.on is not a function问题 我之前也踩过这个坑!从你的报错栈Namespace.<anonymous>就能看出来,你代码里第139行的socket变量根本不是客户端连接的Socket实例,而是Socket.IO的Namespace对象(比如全局的io实例或者某个命名空间对象)。
问题根源
Socket.IO的Namespace对象(比如io)的on方法只能用来监听它自身的内置事件(最常用的就是connection),而客户端发送的自定义事件(比如你的chat)必须绑定到每个成功连接的socket实例上——也就是connection回调函数里拿到的那个socket参数。
正确的写法示例
如果是全局命名空间(没有自定义命名空间),服务器端代码应该这么写:
// 先监听客户端连接事件,拿到每个连接的socket实例 io.on('connection', (socket) => { console.log('客户端已连接'); // 在这里绑定自定义的chat事件 socket.on('chat', function(data){ // 你的聊天逻辑,比如广播消息给其他客户端 socket.broadcast.emit('chat', data); // 或者给自己也发消息 // socket.emit('chat', data); }); });
如果用了自定义命名空间(比如/chat),写法是这样的:
// 创建自定义命名空间 const chatNS = io.of('/chat'); // 监听命名空间下的连接事件 chatNS.on('connection', (socket) => { // 在socket实例上绑定chat事件 socket.on('chat', function(data){ // 处理聊天消息逻辑 chatNS.emit('chat', data); // 给命名空间内所有客户端广播 }); });
检查你的代码
回到你第139行的代码,大概率是你直接在io或者某个命名空间对象上调用了on('chat', ...),而不是在connection回调的socket参数上绑定。比如误写了:
// 错误写法!这会导致报错 io.on('chat', function(data){ ... });
把这段代码移到connection回调里面,用回调里的socket实例来绑定chat事件就解决问题了。
内容的提问来源于stack exchange,提问作者m.o
相关产品推荐
相关产品推荐

