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

Node.js后端Socket.io配置失败:前端与Postman均无法连接

Socket.io连接失败排查与修复

问题描述

Node.js后端的Socket.io配置失败,前端React应用与Postman均无法建立连接,无法获取后端内存中的在线用户列表。

前端终端错误信息

App.js:6 

 GET https://project001db-11.onrender.com/socket.io/?EIO=4&transport=polling&t=P1GAxrA 404 (Not Found)
create  @   polling.js:298
Request @   polling.js:237
request @   polling.js:190
doPoll  @   polling.js:215
poll    @   polling.js:96
doOpen  @   polling.js:56
open    @   transport.js:46
open    @   socket.js:170
Socket  @   socket.js:111
open    @   manager.js:108
Manager @   manager.js:38
lookup  @   index.js:29
./src/App.js    @   App.js:6
options.factory @   react refresh:6
__webpack_require__ @   bootstrap:22
fn  @   hot module replacement:61
./src/index.js  @   TextDecoratorBgIMG.js:21
options.factory @   react refresh:6
__webpack_require__ @   bootstrap:22
(anonymous) @   startup:7
(anonymous)

Postman错误信息

Error: Unexpected server response: 404
Handshake Details
Request URL: https://project001db-11.onrender.com/socket.io/?EIO=4&transport=websocket
Request Method: GET
Request Headers
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: V9DaaiwnspTbd2OaBv42BQ==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: project001db-11.onrender.com

配置背景

  • 后端技术栈:Node.js、Express.js、Socket.io、REST API
  • 部署平台:Render Web Service

服务端代码

const supabase = require("./configdb.js");
const express = require("express");

//socket.io
const { Server } = require("socket.io");
const { createServer } = require("http");

const app = express();
const cors = require("cors");
const port = 3000;

app.use(cors());

app.use(express.json());

//set up socket connection to record online user
const httpServer = createServer(app);
const io = new Server(httpServer, {
  cors: {
    origin: "https://project001db-11.onrender.com",
  },
});

let onlineUser = {};

io.on("connection", (socket) => {
  socket.on("userConnected", (user) => {
    onlineUser[socket.id] = user;
    io.emit("updateUserList", Object.values(onlineUsers));
  });

  socket.on("disconnect"),
    () => {
      delete onlineUsers[socket.id];
      io.emit("updateUserList", Object.values(onlineUsers));
    };
});

// Set port, listen for requests.
app.listen(port, () => {
  console.log(`Server is running on port ${port}.`);
});

// Add routes routes.
require("./routes/chat.routes.js")(express, app);

客户端代码

import "./App.css";
import Chatroom from "./Chatroom";
import { io } from "socket.io-client";
import { useEffect } from "react";

const socket = io("https://project001db-11.onrender.com");

function App() {
  useEffect(() => {
    socket.emit("userConnected", { username: "JohnDoe" });

    socket.on("updateUserList", (users) => {
      console.log("Updated user list:", users);
    });

    return () => {
      socket.disconnect();
    };
  }, []);

  return <Chatroom />;
}

export default App;

问题排查与修复方案

1. 核心问题:启动对象错误

你创建了httpServer挂载Socket.io,但最终启动的是Express的app实例,而非绑定了Socket.io的httpServer。Socket.io依赖这个HTTP服务器才能正常提供服务,必须修正启动代码:

// 替换原app.listen代码
httpServer.listen(port, () => {
  console.log(`Server is running on port ${port}.`);
});

2. 变量名拼写错误

服务端定义的变量是onlineUser,但后续逻辑中错误使用了onlineUsers(多了末尾的s),会导致运行时错误。统一变量名:

let onlineUsers = {};

io.on("connection", (socket) => {
  socket.on("userConnected", (user) => {
    onlineUsers[socket.id] = user;
    io.emit("updateUserList", Object.values(onlineUsers));
  });
});

3. 语法错误:事件绑定格式错误

原代码中socket.on("disconnect"), () => {...}的逗号位置错误,导致断开连接的回调无法被正确绑定,修正为:

socket.on("disconnect", () => {
  delete onlineUsers[socket.id];
  io.emit("updateUserList", Object.values(onlineUsers));
});

4. Render平台适配优化

Render会自动分配端口,建议使用环境变量获取端口,避免硬编码:

const port = process.env.PORT || 3000;

修改代码后重新部署Render服务,确保配置生效。

完成以上修改后,前端与Postman即可正常建立Socket.io连接,获取在线用户列表。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:12:14