nodejs.Error: create “Watcher“ leader failed, the port:55310 is occupied by other
当前问题的核心是端口 55310 被占用,优先通过查找并杀死占用进程,重新启动即可;若端口频繁冲突,可在配置文件中指定自定义端口。如果执行上述步骤后仍报错,可能是 Egg.js 版本与模块不兼容,建议升级 Egg.js 到稳定版本(如2.x最新版),或检查项目依赖是否有冲突。

从日志来看,这是一个 Egg.js 应用启动失败 的典型问题,核心原因是:端口 55310 被其他进程占用,导致 Egg.js 的 cluster-client 模块无法创建 “Watcher” leader(用于集群间通信的主进程)。
一、核心原因分析
Egg.js 在集群模式(默认模式)下,会通过 cluster-client 模块创建一个 “Watcher” 进程,用于管理集群中多个 Worker 进程的通信和状态同步。这个 Watcher 进程需要绑定一个 临时端口(这里是 55310),但当前这个端口已经被其他程序(可能是之前未正常退出的 Egg.js 进程、其他 Node.js 服务或第三方应用)占用,导致 Watcher 创建失败,进而引发整个应用启动崩溃。
二、分步解决方法
1. 查找并杀死占用 55310 端口的进程(最直接)
首先需要找到占用 55310 端口的进程 PID,然后强制终止它。
步骤 1:查找占用端口的进程
打开终端,执行以下命令(macOS/Linux 通用):
# 查找占用 55310 端口的进程
lsof -i:55310
或使用 netstat(部分系统需安装):
netstat -anp | grep 55310
步骤 2:查看输出结果,获取 PID
执行后会显示类似以下内容(重点关注 PID 列和 COMMAND 列):
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 12345 bigo 12u IPv4 0x123456789abcdef 0t0 TCP *:55310 (LISTEN)
PID:进程 ID,这里是12345;COMMAND:占用端口的程序,这里是node(说明是 Node.js 进程)。
步骤 3:强制杀死该进程
执行以下命令(替换 12345 为实际的 PID):
kill -9 12345
-9:强制终止信号,确保进程被彻底关闭。
步骤 4:重新启动 Egg.js 应用
杀死占用端口的进程后,重新执行启动命令(如 npm run start:prod),通常能正常启动。
2. 若找不到占用端口的进程(或端口频繁被占用)
如果执行 lsof -i:55310 没有输出,可能是端口处于 “TIME_WAIT” 状态(进程刚退出,端口暂时未释放),或端口被动态分配导致冲突。此时可通过以下方式解决:
方法 2.1:等待端口释放
“TIME_WAIT” 状态的端口通常会在 30-120 秒内自动释放,等待 1-2 分钟后重新启动应用。
方法 2.2:修改 Egg.js 的 Watcher 端口配置
通过配置指定 cluster-client 的 Watcher 端口,避免使用默认的随机端口(55310 可能是默认随机分配的)。
- 打开 Egg.js 项目的 主配置文件(如
config/config.default.js); - 添加
clusterClient配置,指定port字段(选择一个未被占用的端口,如 55311):// config/config.default.js module.exports = appInfo => { const config = {}; // 其他配置... // 配置 cluster-client 的 Watcher 端口 config.clusterClient = { port: 55311, // 自定义端口,确保未被占用 }; return config; }; - 保存配置后,重新启动应用,Watcher 会绑定到指定的 55311 端口,避免冲突。
3. 检查是否有多个 Egg.js 实例同时启动
如果之前启动过应用但未正常退出(如 npm run start:prod 后直接关闭终端,守护进程可能仍在运行),会导致端口被占用。可通过以下命令查找所有 Node.js 进程并清理:
# 查找所有 Node.js 进程
ps -ef | grep node
# 杀死所有 Egg.js 相关进程(谨慎使用,确保只杀死当前项目的进程)
ps -ef | grep egg | grep -v grep | awk \'{print $2}\' | xargs kill -9
三、总结
当前问题的核心是 端口 55310 被占用,优先通过 lsof -i:55310 查找并杀死占用进程,重新启动即可;若端口频繁冲突,可在配置文件中指定 clusterClient.port 自定义端口。
如果执行上述步骤后仍报错,可能是 Egg.js 版本与 cluster-client 模块不兼容,建议升级 Egg.js 到稳定版本(如 2.x 最新版),或检查项目依赖是否有冲突。
更多推荐


所有评论(0)