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

Node.js Cluster模块isPrimary属性无法正常工作问题求助

问题根源:Node.js版本兼容性问题

你遇到的核心问题是 cluster.isPrimary 这个属性是Node.js v16.0.0才正式引入的新API,而你的本地Node.js版本大概率低于这个版本,导致cluster.isPrimary的值为undefined,所以你的if (cluster.isPrimary)判断永远为false,主进程逻辑完全没执行,直接进入了else分支,只启动了单个进程。

而cluster.isMaster是旧版API(虽然已被废弃,但在v16之前是唯一的主进程判断方式),所以你的Node版本能识别它,功能就正常了。


解决办法

方案1:升级Node.js版本到v16.0.0及以上

先在终端执行命令检查当前Node版本:

node -v

如果版本低于v16,直接升级到最新稳定版(比如v20.x),升级后cluster.isPrimary就能正常工作,你的原有代码不需要修改。

方案2:兼容新旧版本的写法

如果暂时不想升级Node版本,可以用空值合并运算符同时兼容两种判断方式,修改你的主进程判断逻辑:

// 替换原来的if (cluster.isPrimary)
if (cluster.isPrimary ?? cluster.isMaster) {
  for (let i = 0; i < numCPU; i++) {
    cluster.fork();
  }
  cluster.on("listening", (worker) => {
    console.log(worker.process.pid);
  });
  cluster.on("exit", (worker, code, signal) => {
    log.error(`Worker ${worker.process.pid} died. Starting a new worker...`);
    cluster.fork();
  });
} else {
  // 原有子进程逻辑不变
  app.listen(port, host, () => {
    log.info(`Server ${process.pid} listening at http://${host}:${port}`);
    database();
    router(app);
  });
}

??运算符会先判断cluster.isPrimary是否为null/undefined,如果是,就用后面的cluster.isMaster的值,这样新旧Node版本都能正常识别主进程。


补充验证

修改后你应该能看到多个进程的启动日志,并且主进程的listening事件也会打印出每个子进程的PID了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:32:30