Sails使用NODE_ENV=production启动失效 但NODE_ENV=prod运行正常
问题产生的常见原因
- 项目配置加载逻辑未兼容全写环境标识:多数自研Node脚手架、轻量web框架的配置加载模块,默认仅识别
dev/test/prod三个简写环境值,未兼容全写的production。当传入NODE_ENV=production时,配置加载模块无法匹配到对应的配置文件,会 fallback 到默认的本地开发配置,其中的本地数据库、缓存、服务地址在线上环境无法访问,导致服务启动阻塞超时。 - 代码中存在
production环境的专属异常逻辑:项目代码中可能存在针对NODE_ENV === 'production'的专属判断分支,比如启动远程埋点上报、预拉取全量静态资源、强制对接内部运维平台等逻辑,这类逻辑如果配置缺失、网络不通就会卡住启动流程,而prod不会命中该分支,自然不会触发异常。 - PM2残留进程缓存了错误配置:如果你之前使用PM2启动过同名服务,且遗留了错误的环境变量、启动参数缓存,即使本次命令传入了正确的
NODE_ENV=production,PM2也可能优先读取旧的错误配置,导致启动失败。改为prod属于全新的环境变量值,无缓存冲突,所以可以正常启动。 production.js配置文件本身存在错误:如果重命名操作不是纯改文件名,而是新建了prod.js填写配置,可能原production.js存在必填配置缺失、密钥格式错误、地址拼写错误等问题,导致加载配置时抛出未捕获的异常,阻塞启动。
问题验证方案
- 绕过PM2直接启动服务:在项目根目录执行
NODE_ENV=production node app.js,查看控制台输出的报错信息,可直接定位是配置加载失败、还是业务逻辑异常导致的超时。 - 检查配置加载逻辑:找到项目中负责加载环境配置的代码(通常在
config/index.js或根目录启动脚本中),搜索process.env.NODE_ENV相关的匹配规则,确认是否仅匹配了prod未兼容production。 - 清除PM2缓存后重试:执行
pm2 delete all清除所有残留进程和缓存配置,再重新执行NODE_ENV=production pm2 start app.js,如果可以正常启动则确定是PM2缓存问题。
内容的提问来源于stack exchange,提问作者Dhairya Verma
相关产品推荐
相关产品推荐

