nodemon重启Node项目时持续出现EADDRINUSE端口占用错误如何解决?
问题根因
你遇到的EADDRINUSE错误核心原因是旧进程退出时没有主动释放HTTP服务占用的5000端口,你自己新增的进程退出逻辑存在缺陷,反而干扰了进程正常退出流程:
- 没有存储
app.listen返回的HTTP服务实例,收到退出信号时直接杀进程,没有先关闭监听端口的服务,导致内核依然持有端口占用状态 - 监听的进程信号不全,覆盖了nodemon默认的退出处理逻辑,导致进程无法被正常终止
- 旧版本nodemon(你使用的2.0.7)在Ubuntu环境下存在已知的子进程销毁失败问题
解决步骤
1. 修正进程退出逻辑(或者直接删除你自行添加的退出处理代码,nodemon默认即可正常工作)
正确的代码示例如下:
const express = require('express') const app = express() const PORT = 5000; const routes = require('./Settings/routes') app.use(express.json()) routes(app) // 存储HTTP服务实例,后续用于关闭释放端口 const server = app.listen(PORT, ()=> console.log('Сервер работает на порту ' + PORT) ) // 如果你确实需要自定义退出逻辑,按以下写法修正 const terminator = function(sig){ if (typeof sig === "string") { console.log('%s: Received %s - terminating sample app ...', new Date(Date.now()), sig); // 先关闭HTTP服务释放端口 server.close(() => { console.log('%s: Node server stopped.', new Date(Date.now()) ); process.exit(0) }) // 3秒超时兜底,强制退出 setTimeout(() => process.exit(1), 3000) } }; // 补全需要监听的所有进程退出信号 const arrayOfSignals = [ 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGQUIT', 'SIGHUP'] arrayOfSignals.forEach(function(element) { process.on(element, function() { console.log('Ожидаем перезапуск процесса') terminator(element) }); });
2. 排查nodemon运行配置
- 不要使用
sudo运行nodemon命令,sudo启动的子进程权限更高,普通权限的nodemon无法终止该进程,会导致端口残留占用 - 检查package.json中nodemon的配置,删除自定义的
signal等可能干扰进程退出的参数,使用默认配置测试 - 升级nodemon到最新版本,修复已知的进程销毁bug:
npm install nodemon@latest -D
3. 临时应急处理
如果运行过程中出现端口残留,执行以下命令强制释放5000端口:
lsof -ti:5000 | xargs kill -9
内容的提问来源于stack exchange,提问作者Александр Пахомов
相关产品推荐
相关产品推荐

