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
相关产品推荐
相关产品推荐

