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

Express中使用Socket.io出现Address already in use问题排查

问题:Socket.io连接报错EADDRINUSE: address already in use :::3000

我尝试在应用中使用WebSocket,但无法让Socket.io连接到服务器。运行以下代码时,会出现如下错误:

Error: listen EADDRINUSE: address already in use :::3000

我已查找相关解决方案,确认该端口没有其他进程占用,问题应出在项目内部。请问我哪里操作有误?

我的代码:

const express = require("express");
const mongoose = require("mongoose");
const app = express();
const { createServer } = require("http");
const httpServer = createServer(app);

const socketIO = require("socket.io")(3000, { cors: { origin: "*" } });
socketIO.on("connection", (socket) => {
    console.log("connected");
});

const port = 3000;

const startServer = () => {
    httpServer.listen(port);
    console.log(`Listening on port ${port} 🚀`);
};

mongoose
    .connect(uri)
    .then(() => startServer())
    .catch((err) => {
        console.log(err);
    });

解决方案

问题出在你重复占用了3000端口:

  • 调用require("socket.io")(3000, ...)时,Socket.io会自动创建一个独立的HTTP服务器并监听3000端口
  • 后续httpServer.listen(port)又让Express的HTTP服务器再次监听同一端口,导致冲突

正确的做法是让Socket.io挂载到你已经创建好的httpServer上,共用同一个服务器实例和端口。修改后的代码如下:

const express = require("express");
const mongoose = require("mongoose");
const app = express();
const { createServer } = require("http");
const httpServer = createServer(app);

// 将Socket.io挂载到已创建的httpServer,不再单独指定端口
const socketIO = require("socket.io")(httpServer, { cors: { origin: "*" } });
socketIO.on("connection", (socket) => {
    console.log("connected");
});

const port = 3000;

const startServer = () => {
    httpServer.listen(port);
    console.log(`Listening on port ${port} 🚀`);
};

mongoose
    .connect(uri)
    .then(() => startServer())
    .catch((err) => {
        console.log(err);
    });

这样修改后,Socket.io和Express会共用同一个HTTP服务器,不会再出现端口冲突问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:55:19