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
相关产品推荐
相关产品推荐

