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

Node.js的module.parent条件在Ubuntu服务器上不生效问题求助

问题原因

module.parent是Node.js CommonJS模块体系下的内置属性,该属性的取值规则为:当文件被直接执行(例如本地执行node app.js)时,module.parent值为null,此时你的原判断条件!module.parent成立,app.listen正常执行,服务成功启动。

服务器上该条件不成立,通常由以下两类原因导致:

  • 服务端使用PM2等进程管理器、或者封装好的部署框架启动项目,启动逻辑不会直接执行app.js,而是通过父脚本以require('./app.js')的方式加载入口文件,此时app.js的module.parent会指向加载它的父模块,!module.parent判断不成立,app.listen永远不会执行,服务没有监听端口,最终表现为请求超时。
  • module.parent从Node.js v14.6.0、v12.19.0版本开始已经被官方标记为弃用,本地和服务器的Node.js版本差异也可能导致该属性的取值表现不一致。

解决方案

方案1:替换为官方推荐的入口判断逻辑

使用社区和官方通用的require.main === module判断替代原有逻辑,该写法不受父模块加载逻辑影响,兼容性更强:

if (require.main === module) {
  // Server listen
  app.listen(mysettings.port, function () {
    console.log(`Server ready at ${ENV}:${mysettings.port}`);
  });
}

方案2:直接移除条件判断

如果确认app.js仅作为项目入口使用,不会被其他文件作为模块引用,可以直接删除条件包裹,保留app.listen执行逻辑即可,和你当前注释条件后的运行效果一致。

方案3:调整服务端启动逻辑

如果要保留原有module.parent判断,可修改服务端启动配置,改为直接执行app.js文件,例如PM2启动时直接执行pm2 start app.js,不要通过封装的启动脚本间接加载入口文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:24:00