[英]Address already in use with Socket.io in Express
我正在嘗試在我的應用程序中使用 websockets,但我無法讓 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);
});
如果您不提供 socket.io 和 http 服務器,它將為您創建一個。 因此,您的代碼實際上是在創建兩個 http 服務器,它們都試圖在同一個端口上偵聽,但EADDRINUSE
失敗。
相反,將httpServer
作為第一個參數傳遞給 socket.io 而不是端口號:
const socketIO = require("socket.io")(httpServer, { cors: { origin: "*" } });
它的發生是因為
const startServer = () => {
httpServer.listen(port);
console.log(`Listening on port ${port} 🚀`);
};
這里已經使用了地址 3000 ......所以你不應該將 port:3000 傳遞給 socketIO,最好通過 httpServer,比如:
const socketIO = require("socket.io") (httpServer, cors: { origin: "*" } });
socketIO.on("connection", (socket) => {
console.log("connected");
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.