使用forever启动Node.js旧项目时出现padLevels警告且服务无法启动的求助
看起来你遇到的是旧版本forever与当前Node.js环境不兼容的问题——毕竟直接用node命令能正常启动服务,换forever就出警告且启动失败,咱们从几个贴合你「不想做复杂代码改动」需求的方向来解决:
问题核心原因
这个padLevels警告的本质是:你依赖的forever@0.15.2是非常老旧的版本(大概2016年发布),而当前你使用的Node.js版本远高于当时的环境,旧版forever的代码里引用了Node.js内部模块已经移除的padLevels属性,导致循环依赖中访问不存在的属性,进而让forever无法正常完成应用的启动流程。
无需修改项目代码的解决办法
1. 给forever添加兼容参数
旧版forever在新Node.js环境下,有时候需要开启--legacy-watch参数来兼容文件监听和进程启动逻辑,修改你的package.json里的启动命令即可:
"start-windows": "set NODE_ENV=production&& forever start --legacy-watch server/app.js"
2. 调整Windows命令格式(修复空格问题)
Windows的命令行解析对空格比较敏感,你原来的命令里set NODE_ENV=production&&后面没有空格,虽然node能正常识别,但forever的进程启动逻辑可能因此出现异常,试试加个空格:
"start-windows": "set NODE_ENV=production && forever start server/app.js"
3. 降级Node.js到匹配的旧版本
如果上面的参数调整都无效,最彻底的兼容方式是把你的Node.js版本降级到和项目依赖匹配的LTS版本(比如Node.js 6.x或8.x,因为你的项目依赖大多是2016-2017年的版本,当时对应的LTS就是6/8系列),这样旧版forever就能和Node.js环境完美适配,不需要任何额外调整。
这些方法都只需要修改启动命令或者Node.js环境,完全不需要改动项目的业务代码,符合你不想做「复杂代码修改」的需求。
备注:内容来源于stack exchange,提问作者MaVRoSCy

