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

Node.js服务端Socket.IO无响应问题及CORS配置解决方案

Node.js + Express 搭建Socket.IO服务客户端连接无响应问题排查与修复

问题现象

使用Node.js与Express搭建Socket.IO服务时,代码严格遵循官方文档及教程要求编写,客户端尝试连接运行在http://localhost:8090的服务端时,Socket.IO始终无响应。

问题根源

经排查,问题源于未在服务端Socket实例上配置CORS规则:自Socket.IO v3版本起,必须显式声明cors属性,指定允许接入Socket服务的源地址,才能正常完成连接。注意Express层面配置的CORS规则对Socket.IO不生效,需要单独给Socket.IO实例配置。

原服务端代码

const express = require ('express');
const bodyParser = require('body-parser');
const cookieParser =  require('cookie-parser');
const db = require("./Connection/pg_pool");
const authentication = require("./Config/auth");
const connectionError = require("./Config/connectionError");
const cors = require('cors');
let port = 8090;
let hostname = 'localhost';
const midtransClient = require('midtrans-client');
const paymentConf = require('./Config/payment');
const { encode } = require('node-encoder');
const axios = require('axios');

let payment =  paymentConf.paymentConf;
let errorMsg = connectionError.connectionError();
let auth = authentication.auth;

const app = express();

const server = require("http").createServer(app);
const io = require('socket.io')(server)
io.on("connection", socket => {
    console.log('NEW USER CONNECTED')
});

app.use(express.json());
app.use(cors({origin: true, credentials: true}));
app.use(express.urlencoded({extended: true}));
app.use(cookieParser());

server.listen(process.env.PORT || port, hostname, () => {
    console.log(`Listening to ${hostname}:${port}`)
})

原客户端代码(React示例)

import React, {useState, useEffect, useRef, useCallback, useMemo} from 'react';
import { io } from "socket.io-client";

const ENDPOINT = "http://localhost:8090";
let socket;

export default function Chat(props) {

  const [text, setText] = useState('')
  const [req, setReq] = useState([]);
  const [messages, setMessages] = useState([]);
  const [send, setSend] = useState(false);


  useEffect(() => {
    socket = io(ENDPOINT);
    console.log('ini socker', socket.connected)
    socket.on("connect", (data) => {
      console.log(data)
    });
  }, []);
// 后续业务逻辑省略
....

修复方案

在服务端初始化Socket.IO实例时,单独传入CORS配置,指定允许的客户端源地址即可,示例中前端运行在http://localhost:3000,配置如下:

/* 前端运行在localhost:3000,只需在服务端Socket实例上定义cors规则,填入允许接入的源地址即可 */
const io = require('socket.io')(server, {
    cors: {
      origin: [`http://localhost:3000`],
      credentials: true
    }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 01:54:04