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

Socket.io连接JavaScript客户端遇两类错误,问题反复出现求排查方案

问题分析与解决方案

1. 核心问题:服务端代码存在语法错误,导致服务无法正常启动

你的服务端代码有两处语法错误,这会直接导致Node.js进程启动失败,进而引发connection refused和io is not defined(服务没起来,客户端请求socket.io.js资源失败):

错误1:disconnect事件监听位置错误

你把socket.on('disconnect', ...)写在了io.on('connection', socket=>{...})的外部,这里的socket是连接回调里的局部变量,外部无法访问,会直接抛出ReferenceError: socket is not defined,导致服务启动失败。

错误2:emit的参数语法错误

在send事件的处理中,传递的对象未用大括号包裹:

socket.broadcast.emit('recieve',message:message,name:users[socket.id])

正确写法需要用大括号定义对象:

socket.broadcast.emit('recieve', { message: message, name: users[socket.id] })

修复后的完整服务端代码

const io = require('socket.io')(8000);
const users = {};

io.on('connection', socket => {
    socket.on('new-user-joined', name => {
        users[socket.id] = name;
        socket.broadcast.emit('user-joined', name);
    });

    socket.on('send', message => {
        socket.broadcast.emit('recieve', { 
            message: message, 
            name: users[socket.id] 
        });
    });

    // 将disconnect事件监听移到connection回调内部
    socket.on('disconnect', () => {
        socket.broadcast.emit('left', users[socket.id]);
        delete users[socket.id];
    });
});

2. 针对两个错误的具体解决说明

错误:io is not defined

  • 原因:服务端未正常启动,客户端请求http://localhost:8000/socket.io/socket.io.js时返回404或连接失败,Socket.io客户端脚本未加载成功,全局变量io不存在。
  • 解决:修复服务端代码后,确保服务正常启动,此时访问http://localhost:8000/socket.io/socket.io.js应能看到脚本内容,客户端即可正确加载io对象。

错误:connection refused

  • 原因:服务端进程未启动(代码语法错误导致),或端口被占用(你换端口无效,说明核心是代码问题)。
  • 解决:
    1. 修复服务端语法错误,启动服务时查看控制台报错信息,确保服务正常运行。
    2. 启动服务后,用netstat或lsof命令检查8000端口是否被Node.js进程占用,确认服务在监听该端口。

额外注意事项

  • 启动服务时必须查看Node.js控制台输出,优先解决报错信息,这是排查问题的关键。
  • 若服务端和客户端在同一域名下,可直接用const socket = io();连接,无需指定URL,避免拼写错误。

内容的提问来源于stack exchange,提问作者Muhammad Hashir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:20:43