Error: listen EADDRINUSE: address already in use :::5000 BUT dotnet server does let me run api in port 5000

Error: listen EADDRINUSE: address already in use :::5000 BUT dotnet server does let me run api in port 5000

我知道这个错误已被问过一百万次,但我认为答案不正确或不是最有效的。

// import all libraries
const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');

const app = express();

require('dotenv').config();

// setup connections
mongoose.connect(process.env.MONGODB_URL)
    .then(() => console.log("Connected to DB "))
    .catch(() => console.log("Couldn't connect to db ❌"));

// setup middlewares
app.use(cors()); // CORS => Cross origin resource sharing; // share frontend <-> backend
app.use(express.json());

// setup routes
app.use("/api/auth", require("./routes/user"));
app.use("/api/books", require("./routes/book"));
app.use("/api/rentals", require("./routes/rental"));

// start listening on server
const port = process.env.PORT;
app.listen(port, () => {
    console.log("Server running...");
})

有我的代码供参考。如果我在 .env 中将端口从 5000 更改为 5500,一切正常。如果我停用空中播放端口,一切正常。

我的问题是,当我 运行 端口 5000 中的 dotnet api 服务器时没有错误。

为什么我可以 运行 一个 dotnet 服务器在 5000 中没有问题,但在节点中它给我一个错误?

我 运行 lsof -i tcp:5000 同时 运行 我的 dotnet api:

COMMAND     PID             USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
firefox     938 arturofiliovilla  137u  IPv4 0x23e78a2a111d8441      0t0  TCP localhost:59093->localhost:commplex-main (ESTABLISHED)
ControlCe 25701 arturofiliovilla   21u  IPv4 0x23e78a2a108e4ed1      0t0  TCP *:commplex-main (LISTEN)
ControlCe 25701 arturofiliovilla   22u  IPv6 0x23e78a1babf17ce9      0t0  TCP *:commplex-main (LISTEN)
API       26565 arturofiliovilla  238u  IPv4 0x23e78a2a12ba39b1      0t0  TCP localhost:commplex-main (LISTEN)
API       26565 arturofiliovilla  239u  IPv6 0x23e78a1babf09189      0t0  TCP localhost:commplex-main (LISTEN)
API       26565 arturofiliovilla  241u  IPv4 0x23e78a2a10910ed1      0t0  TCP localhost:commplex-main->localhost:59093 (ESTABLISHED)

也许有掩码?我不确定,但我的 dotnet 服务器没有错误。

知道为什么会这样吗?

  1. Node.js/Express 默认尝试绑定到 [::]:5000 and/or 0.0.0.0:5000,当你只指定端口 5000 时。这就是发生冲突的原因。
  2. ASP.NET 核心,但是,默认情况下绑定到 localhost:5000

如果你阅读更多关于计算机网络的知识,你会发现这两种绑定方法之间的差异有多大。

您可以尝试让 Express 绑定到 localhost:5000,也就是

app.listen(port, "localhost", () => {
    console.log("Server running...");
})

参考资料