簡體   English   中英

已在 Express 中與 Socket.io 一起使用的地址

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM