You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

内容的提问来源于stack exchange,提问作者Jake Jackson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:36:01