Nodemon每次保存文件均报EADDRINUSE端口占用错误该如何解决?
问题根因
这是Nodemon重启场景下的典型端口未及时释放问题:Nodemon检测到文件变更后会立即终止旧进程、启动新进程,但旧进程对应的TCP连接处于TIME_WAIT状态,尚未完成端口释放,新进程尝试监听同一端口就会抛出EADDRINUSE错误。第二次保存时旧进程已经完成端口释放,因此服务可以正常启动。
可行解决方案
方案1:添加启动延迟(最简便,优先尝试)
启动Nodemon时添加--delay参数,让新进程延迟启动,等待端口完成释放,示例命令:nodemon --delay 1000ms index.js延迟时长可根据实际情况调整,通常1~2秒即可解决绝大多数同类问题。
方案2:代码层主动监听重启信号,提前关闭服务释放端口
保存Express服务的server实例,监听Nodemon重启时发送的SIGUSR2信号,主动关闭服务后再触发进程重启,示例代码:const express = require('express') const app = express() // 存储server实例 const server = app.listen(8800, () => { console.log('服务运行在端口8800') }) // 监听Nodemon重启信号 process.once('SIGUSR2', () => { server.close(() => { console.log('服务已关闭,端口释放完成') process.kill(process.pid, 'SIGUSR2') }) })方案3:新增Nodemon配置文件优化规则
在项目根目录新建nodemon.json配置文件,配置忽略非业务代码文件的监听避免频繁重启,同时统一配置启动延迟:{ "watch": ["src/"], "ignore": ["node_modules", "*.log", "public/static/"], "delay": 1000, "ext": "js,json" }方案4:开启端口重用配置
调整服务启动参数,开启端口重用允许同一端口被多个进程绑定,仅推荐开发环境使用:const server = app.listen({ port: 8800, reusePort: true })临时应急方案:手动释放端口
如果临时遇到报错不想调整配置,可以执行命令直接杀死占用端口的进程:- Linux/macOS:
lsof -ti:8800 | xargs kill -9 - Windows:先执行
netstat -ano | findstr :8800找到对应PID,再执行taskkill /PID 替换为实际PID /F
- Linux/macOS:
内容的提问来源于stack exchange,提问作者Jake Jackson
相关产品推荐
相关产品推荐

