无法将NestJS应用部署至Heroku的问题排查
NestJS部署Heroku报错:Cannot find module '/app/dist/main'
问题描述
部署NestJS应用到Heroku时,日志出现以下错误:
2022-09-03T16:19:06.793730+00:00 app[web.1]: > pokedex@0.0.1 start:prod 2022-09-03T16:19:06.793731+00:00 app[web.1]: > node dist/main 2022-09-03T16:19:06.793731+00:00 app[web.1]: 2022-09-03T16:19:06.859243+00:00 app[web.1]: node:internal/modules/cjs/loader:959 2022-09-03T16:19:06.859244+00:00 app[web.1]: throw err; 2022-09-03T16:19:06.859245+00:00 app[web.1]: ^ 2022-09-03T16:19:06.859245+00:00 app[web.1]: 2022-09-03T16:19:06.859245+00:00 app[web.1]: Error: Cannot find module '/app/dist/main' 2022-09-03T16:19:06.859246+00:00 app[web.1]: at Function.Module._resolveFilename (node:internal/modules/cjs/loader:956:15) 2022-09-03T16:19:06.859247+00:00 app[web.1]: at Function.Module._load (node:internal/modules/cjs/loader:804:27) 2022-09-03T16:19:06.859247+00:00 app[web.1]: at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) 2022-09-03T16:19:06.859247+00:00 app[web.1]: at node:internal/main/run_main_module:17:47 { 2022-09-03T16:19:06.859248+00:00 app[web.1]: code: 'MODULE_NOT_FOUND', 2022-09-03T16:19:06.859248+00:00 app[web.1]: requireStack: [] 2022-09-03T16:19:06.859249+00:00 app[web.1]: }
已尝试操作:
- 创建包含
npm run start:prod命令的Procfile - 将
@nestjs/cli从devDependencies移至dependencies
问题仍未解决。
解决方案
1. 确保package.json包含正确的构建脚本
Heroku默认会在部署时执行npm run build,如果package.json里没有定义该脚本,就无法生成dist目录。检查并配置:
"scripts": { "build": "nest build", "start:prod": "node dist/main" }
2. 检查.gitignore是否排除dist目录
如果本地.gitignore包含dist/,该目录不会被推送到Heroku。推荐保留.gitignore中的dist/,通过Heroku自动构建生成目录,而非提交dist到仓库。
3. 配置Heroku构建钩子
如果Heroku未自动执行构建,添加heroku-postbuild脚本触发构建:
"scripts": { "heroku-postbuild": "npm run build" }
4. 确保端口适配Heroku环境
NestJS需监听Heroku提供的PORT环境变量,修改main.ts:
async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(process.env.PORT || 3000); } bootstrap();
5. 处理构建依赖
Heroku生产环境默认跳过devDependencies安装,若构建需要dev依赖,可配置预构建脚本安装dev依赖,构建完成后清理:
"scripts": { "heroku-prebuild": "npm install --only=dev", "heroku-postbuild": "npm run build && npm prune --production" }
内容的提问来源于stack exchange,提问作者Martin Pilaszek
相关产品推荐
相关产品推荐

