npm start启动报EADDRINUSE 5000端口占用 kill-port命令无效
故障原因
listen EADDRINUSE: address already in use :::5000报错的本质是要监听的5000端口已经被其他进程持有,之前执行npx kill-port 5000没有杀掉真正占用端口的进程,所以重启服务依旧报错。
从贴出的代码和运行日志看,还存在额外的代码问题:重复写了两次mongoose.connect调用,属于冗余逻辑,会创建多余的数据库连接,虽然不是端口报错的直接诱因,但需要修复。
排查&解决步骤
- 先定位真正占用5000端口的进程,不要盲目执行kill命令,在终端执行带管理员权限的查询命令:
输入系统密码后会输出所有占用5000端口的进程信息,重点看sudo lsof -i :5000COMMAND(进程名)和PID(进程ID)两列:- 如果进程名是
ControlCenter或者AirPlayXPCHelper:这是MacOS系统默认开启的AirPlay接收器服务,属于系统级进程,普通权限的kill命令杀不掉,杀完也会自动重启。两种解决方式二选一:- 不改动项目的永久解决方法:打开系统设置→通用→隔空投送与接力,关闭「AirPlay接收器」开关,等待10秒端口就会自动释放。
- 不改动系统设置的快速验证方法:把服务监听端口改成其他未被占用的端口,比如将代码里的
const PORT = process.env.PORT || 5000改为const PORT = process.env.PORT || 5001,前端接口请求地址对应同步修改端口即可。
- 如果进程名是
node:说明是之前启动异常退出的Node服务残留进程,普通权限没杀掉,执行以下命令强制终止:sudo kill -9 替换为上一步查到的对应PID数字
- 如果进程名是
- 修复代码里的冗余逻辑,删掉重复的数据库连接代码,补充端口监听的错误捕获,避免服务无提示崩溃,修正后的服务端入口代码如下:
import express from "express"; import bodyParser from "body-parser"; import mongoose from "mongoose"; import cors from "cors"; const app = express(); app.use(bodyParser.json({ limit: "30mb", extended: true })); app.use(bodyParser.urlencoded({ limit: "30mb", extended: true })); app.use(cors()); const CONNECTION_URL = 'mongodb+srv://weiz:123456wz@cluster0.s6fc6.mongodb.net/?retryWrites=true&w=majority'; const PORT = process.env.PORT || 5000; // 仅保留一次数据库连接逻辑 mongoose.connect(CONNECTION_URL, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { app.listen(PORT, () => console.log(`Server running on port: ${PORT}`)) // 显式捕获端口占用错误 app.on('error', (err) => { if (err.code === 'EADDRINUSE') { console.error(`Port ${PORT} is already in use, please check and retry.`); process.exit(1); } }) }) .catch((error) => console.log(error.message));
验证
处理完成后先执行一次lsof -i :5000(如果改了端口就查你改后的端口号),确认没有进程占用后再执行npm start,控制台正常输出服务运行端口的日志即为启动成功。
内容的提问来源于stack exchange,提问作者SquirtleBig
相关产品推荐
相关产品推荐

