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

Next.js 14集成Socket.io遇连接拒绝错误求助

解决Socket.IO连接拒绝(ERR_CONNECTION_REFUSED)问题的排查方向

针对你在Next.js 14中遇到的Socket.IO连接拒绝错误,结合你的代码和排查情况,以下是几个容易被忽略的疏漏点和解决建议:

1. 验证CORS配置的有效性

服务器端CORS使用了process.env.DOMAIN作为origin,但如果这个环境变量未正确设置、值不匹配客户端实际域名(比如缺少http:///https://后缀,或域名端口不一致),会导致CORS拦截,间接表现为连接被拒绝。

  • 临时测试方案:将CORS的origin硬编码为客户端实际访问地址(比如"http://localhost:3000"),重新启动服务器后尝试连接,若能成功则说明环境变量配置有误。
  • 补充配置:建议显式指定允许的methods,取消注释methods: ["GET", "POST"],避免因请求方法被拦截导致的连接失败。

2. 确认服务器监听地址与客户端可达性

  • 服务器监听范围:当前代码中server.listen(3005)默认只监听本地回环地址127.0.0.1,若客户端在非本地环境(比如Docker容器、远程开发机)访问,会无法连接。修改为:
    server.listen(3005, '0.0.0.0', () => {
        console.log('Socket.IO server listening on port 3005');
    });
    
  • 直接验证端点:在客户端浏览器地址栏访问http://localhost:3005/socket.io/,若返回类似0{"sid":"xxx","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":5000}的JSON响应,说明服务器端点正常;若仍拒绝连接,需进一步排查服务器启动状态、端口占用(可再次用netstat -ano | findstr :3005(Windows)或lsof -i :3005(Mac/Linux)确认)。

3. 检查Socket.IO版本兼容性

服务器端socket.io与客户端socket.io-client版本不匹配是常见的连接失败原因,尤其是跨大版本(比如4.x vs 3.x)。

  • 分别在服务器和客户端项目根目录执行:
    # 服务器端
    npm list socket.io
    # 客户端
    npm list socket.io-client
    
  • 确保两者版本完全一致,若不一致则升级/降级其中一方至匹配版本。

4. 排查客户端上下文配置的潜在问题

  • 依赖项优化:useEffect的依赖数组为空,逻辑上只会执行一次,可去掉if (socket == null)判断(避免异步state更新导致的逻辑混乱):
    useEffect(() => {
        const socketIo = io.connect('http://localhost:3005', {
            reconnectionDelay: 1000,
            reconnection: true,
            reconnectionAttempts: 10,
            agent: false,
            upgrade: false,
            rejectUnauthorized: false,
        });
    
        setSocket(socketIo);
    
        return () => {
            socketIo.disconnect();
        };
    }, []);
    
  • 客户端组件限制:确认SocketContextProvider仅在客户端组件中使用(因代码标注了"use client"),若在服务器组件中嵌套会导致无法初始化socket连接。

5. 排除业务逻辑阻塞

服务器端connection事件中的test监听包含数据库连接和changeStream逻辑,若数据库连接缓慢或失败,可能阻塞socket握手流程。

  • 简化测试:暂时注释掉数据库相关代码,使用最简化的服务器逻辑(仅处理连接和测试消息),若能正常连接则说明问题出在数据库操作部分,需排查connectToDatabase或changeStream的异常。

6. 防火墙与代理干扰

  • 检查本地防火墙、杀毒软件是否拦截了3005端口的入站请求;
  • 若使用Next.js的rewrite规则或反向代理(如Nginx),确认未对/socket.io/路径进行错误转发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:35:13