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

