You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:07:29