使用Socket.IO实时同步API数据时遇连接拒绝错误求助
排查Socket.IO连接拒绝错误(ERR_CONNECTION_REFUSED)
针对你遇到的GET http://localhost:3002/socket.io/?EIO=4&transport=polling&t=OuMq4L7 net::ERR_CONNECTION_REFUSED错误,按以下步骤逐一排查:
1. 确认后端服务器是否正常启动
- 启动服务器后,检查终端是否输出
Server is running on http://localhost:3002,没有则说明服务器未成功启动:- 先安装所有依赖:
npm install express socket.io ejs node-fetch(替换已废弃的request模块) - 运行服务器时查看终端报错,比如
serviceKey未填写真实密钥、API请求失败导致的崩溃,这类问题会直接阻止服务器启动。
- 先安装所有依赖:
2. 检查端口占用情况
- 3002端口可能被其他程序占用,导致服务器无法绑定:
- Windows:执行
netstat -ano | findstr :3002查看占用进程,通过任务管理器杀掉对应PID的进程 - Mac/Linux:执行
lsof -i :3002查看占用进程,用kill -9 PID终止进程 - 或者直接修改后端
PORT变量(比如改成3003),同时前端连接地址同步改为http://localhost:3003
- Windows:执行
3. 配置Socket.IO跨域规则
- 若前端通过
file://协议直接打开HTML文件,或从其他域名/端口访问,会触发跨域限制,需在后端添加CORS配置:// 修改Socket.IO初始化代码 const io = socketIo(server, { cors: { origin: "*", // 开发环境临时使用,生产环境需指定具体域名 methods: ["GET", "POST"] } }); - 注意:正确的访问方式是通过后端路由打开页面,即访问
http://localhost:3002,而非直接打开本地HTML文件。
4. 匹配Socket.IO客户端与服务端版本
- 你前端使用的是Socket.IO 4.0.0版本,需确保服务端版本一致:
- 执行
npm list socket.io查看服务端版本,若版本不匹配,安装对应版本:npm install socket.io@4.0.0
- 执行
5. 替换废弃的request模块
request模块已停止维护,容易引发潜在错误,建议换成node-fetch,修改后的fetchData函数如下:const fetch = require('node-fetch'); const fetchData = async () => { const queryParams = new URLSearchParams({ serviceKey: "你的真实服务密钥", // 替换成实际的serviceKey pageNo: "1", numOfRows: "10", _type: "json", cityCode: "25", routeId: "DJB30300052", }); try { const response = await fetch(`${apiUrl}?${queryParams}`); if (!response.ok) throw new Error(`API请求失败,状态码:${response.status}`); const jsonResponse = await response.json(); const routeType = jsonResponse.response.body.items.item[0].routetp; console.log("Route Type:", routeType); io.emit("routeTypeUpdated", routeType); } catch (error) { console.error("获取数据出错:", error); } };
6. 简化前端连接代码
- 若前端通过后端渲染(EJS),无需指定完整URL,直接使用自动连接:
const socket = io(); // 自动连接当前页面的域名和端口
内容的提问来源于stack exchange,提问作者이정민
相关产品推荐
相关产品推荐

