Heroku部署H10错误(503):找不到模块'./secrets.json'求助
Heroku部署H10错误(503状态码)排查与解决
核心问题分析
- 错误根源:日志明确显示
Error: Cannot find module './secrets.json',说明Heroku容器中server.js所在目录下不存在secrets.json文件 - 关于
/app/server.js:这是Heroku容器内部的应用根目录路径,并非你本地项目的app文件夹——Heroku会将你的项目代码部署到容器的/app目录下,所以本地根目录的server.js在容器内的路径就是/app/server.js,属于正常情况,和本地目录结构无关
可能的原因及解决方案
1. secrets.json被.gitignore忽略
如果项目克隆自远程仓库,大概率原仓库的.gitignore文件包含secrets.json(这类敏感配置文件通常不会被提交到Git),导致推送代码到Heroku时该文件未被上传。
- 解决方案:
- 检查本地项目根目录的
.gitignore文件,确认是否存在secrets.json条目 - 不要直接将
secrets.json提交到Git,改用Heroku环境变量替代:- 将
secrets.json中的配置项(如数据库密钥、API密钥等)逐个添加到Heroku环境变量:heroku config:set KEY_NAME=对应值 - 修改
server.js中读取配置的代码,从环境变量获取值,而非读取secrets.json:// 替换原有的require('./secrets.json') const secrets = { dbKey: process.env.DB_KEY, apiKey: process.env.API_KEY // 其他配置项依次对应 };
- 将
- 检查本地项目根目录的
2. 本地secrets.json路径存在隐性问题
虽然本地能正常运行,但相对路径可能因本地启动时的工作目录与Heroku容器内不同而出现问题。
- 解决方案:使用绝对路径引用文件(仅在确定要推送
secrets.json时使用,不推荐提交敏感文件):const path = require('path'); const secrets = require(path.join(__dirname, 'secrets.json'));
3. 克隆仓库后本地缺少secrets.json
若克隆的仓库本身未包含secrets.json(原作者未提交),你本地自行创建的该文件未推送到Git,导致Heroku上没有该文件。
- 解决方案:同上,优先使用Heroku环境变量管理敏感配置,避免提交该文件到版本库。
已尝试操作的补充说明
你之前进行的版本配置、Procfile设置、端口配置、数据库URL配置均无问题,与当前的MODULE_NOT_FOUND错误无关,无需调整。
完整Heroku日志
2023-07-01T19:42:53.159323+00:00 heroku[web.1]: State changed from crashed to starting 2023-07-01T19:42:56.049904+00:00 heroku[web.1]: Starting process with command `npm start` 2023-07-01T19:42:57.825975+00:00 app[web.1]: 2023-07-01T19:42:57.826010+00:00 app[web.1]: > petition@1.0.0 start 2023-07-01T19:42:57.826010+00:00 app[web.1]: > node server.js 2023-07-01T19:42:57.826011+00:00 app[web.1]: 2023-07-01T19:42:58.037800+00:00 app[web.1]: node:internal/modules/cjs/loader:1080 2023-07-01T19:42:58.037802+00:00 app[web.1]: throw err; 2023-07-01T19:42:58.037802+00:00 app[web.1]: ^ 2023-07-01T19:42:58.037803+00:00 app[web.1]: 2023-07-01T19:42:58.037803+00:00 app[web.1]: Error: Cannot find module './secrets.json' 2023-07-01T19:42:58.037803+00:00 app[web.1]: Require stack: 2023-07-01T19:42:58.037804+00:00 app[web.1]: - /app/server.js 2023-07-01T19:42:58.037804+00:00 app[web.1]: at Module._resolveFilename (node:internal/modules/cjs/loader:1077:15) 2023-07-01T19:42:58.037805+00:00 app[web.1]: at Module._load (node:internal/modules/cjs/loader:922:27) 2023-07-01T19:42:58.037805+00:00 app[web.1]: at Module.require (node:internal/modules/cjs/loader:1143:19) 2023-07-01T19:42:58.037805+00:00 app[web.1]: at require (node:internal/modules/cjs/helpers:110:18) 2023-07-01T19:42:58.037805+00:00 app[web.1]: at Object.<anonymous> (/app/server.js:15:34) 2023-07-01T19:42:58.037806+00:00 app[web.1]: at Module._compile (node:internal/modules/cjs/loader:1256:14) 2023-07-01T19:42:58.037806+00:00 app[web.1]: at Module._extensions..js (node:internal/modules/cjs/loader:1310:10) 2023-07-01T19:42:58.037806+00:00 app[web.1]: at Module.load (node:internal/modules/cjs/loader:1119:32) 2023-07-01T19:42:58.037807+00:00 app[web.1]: at Module._load (node:internal/modules/cjs/loader:960:12) 2023-07-01T19:42:58.037807+00:00 app[web.1]: at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) { 2023-07-01T19:42:58.037807+00:00 app[web.1]: code: 'MODULE_NOT_FOUND', 2023-07-01T19:42:58.037808+00:00 app[web.1]: requireStack: [ '/app/server.js' ] 2023-07-01T19:42:58.037808+00:00 app[web.1]: } 2023-07-01T19:42:58.037812+00:00 app[web.1]: 2023-07-01T19:42:58.037812+00:00 app[web.1]: Node.js v18.16.1 2023-07-01T19:42:58.238635+00:00 heroku[web.1]: Process exited with status 1 2023-07-01T19:42:58.267875+00:00 heroku[web.1]: State changed from starting to crashed
内容的提问来源于stack exchange,提问作者Asaf Nimer
相关产品推荐
相关产品推荐

