跳至主要内容

如何处理 EADDRINUSE 错误

监听时最常见的错误之一是 EADDRINUSE。当另一个服务器已经在请求的 port/path/handle 上监听时,就会发生这种情况。

node:events:489
throw er; // Unhandled 'error' event
^

Error: listen EADDRINUSE: address already in use :::8080
at Server.setupListenHandle [as _listen2] (node:net:1829:16)
at listenInCluster (node:net:1877:12)
at Server.listen (node:net:1965:7)

一种处理方法是捕获错误并在一段时间后重试。

const { createServer } = require("node:http");
const { Server } = require("socket.io");

const httpServer = createServer();
const io = new Server(httpServer);

const PORT = process.env.PORT || 8080;

io.on("connection", (socket) => {
// ...
});

httpServer.on("error", (e) => {
if (e.code === "EADDRINUSE") {
console.error("Address already in use, retrying in a few seconds...");
setTimeout(() => {
httpServer.listen(PORT);
}, 1000);
}
});

httpServer.listen(PORT);

参考: https://node.org.cn/api/net.html#serverlisten

提示

在测试时,您可能不需要使用特定端口。您可以简单地省略端口,操作系统会自动为您选择一个任意的未使用的端口。

const { createServer } = require("node:http");
const { Server } = require("socket.io");

const httpServer = createServer();
const io = new Server(httpServer);

httpServer.listen(() => {
const port = httpServer.address().port;
// ...
});

返回示例列表