每次保存代码后服务端抛出端口已被占用EADDRINUSE错误如何解决
报错原因
当前使用nodemon实现代码修改后自动重启服务,热重载过程中旧服务进程没有被正常杀死,仍持续占用8800端口,新启动的服务进程尝试绑定同一端口时就会触发EADDRINUSE(地址已被占用)错误。
解决方法
临时应急方案(报错后单次处理)
根据你使用的操作系统执行对应命令,手动杀死占用8800端口的进程:
- Windows系统:
- 打开cmd执行
netstat -ano | findstr :8800,查询占用端口的进程PID - 执行
taskkill /PID 此处替换为查询到的PID /F,强制杀死目标进程
- 打开cmd执行
- Mac/Linux系统:
可以直接执行一键杀死占用8800端口进程的命令:lsof -ti:8800 | xargs kill -9
永久修复方案(从根源避免问题)
方案1:修改nodemon启动参数
打开package.json,修改scripts中的test配置,给nodemon添加终止信号参数:
"scripts": { "test": "nodemon --signal SIGTERM index.js" }
该配置会强制nodemon重启服务时,给旧进程发送SIGTERM信号,保证旧进程完全退出、释放端口资源。
方案2:代码中添加端口自动释放逻辑
修改index.js中的端口监听代码,监听进程退出事件主动关闭服务释放端口:
const server = app.listen(8800, () => { console.log("Backend server is running!"); }); process.on('SIGTERM', () => { server.close(() => { console.log('服务已关闭,端口已释放'); }); });
方案3:升级nodemon版本
旧版本nodemon存在已知的热重载时无法正常杀死旧进程的bug,执行以下命令升级到最新版本即可:npm i nodemon@latest -D
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

