Nest.js+Prisma部署Heroku成功但路由失效,启动报模块找不到错误
Nest.js + Prisma 部署Heroku失败:找不到dist/main模块
花了两天时间尝试将首个基于Nest.js和Prisma的后端应用部署到Heroku,升级所有依赖版本后仍存在启动问题——生产环境启动时提示找不到/app/dist/main模块,怀疑package.json配置有误。以下是相关文件内容:
package.json
{ "name": "dez-backend", "version": "0.0.1", "engines": { "node":"18.x", "npm": "9.x" }, "description": "Backend developed for edez mobile App", "author": "Draghici Adrian", "private": true, "license": "UNLICENSED", "type": "module", "scripts": { "prebuild": "rimraf dist", "postinstall": "npx prisma generate && npm run build", "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { "@nestjs/axios": "^2.0.0", "@nestjs/common": "^9.3.9", "@nestjs/core": "^9.3.9", "@nestjs/jwt": "^10.0.2", "@nestjs/passport": "^9.0.3", "@nestjs/platform-express": "^9.3.9", "@prisma/client": "^4.11.0", "@types/body-parser": "^1.19.2", "aws-sdk": "^2.997.0", "axios": "^1.3.4", "bcrypt": "^5.1.0", "body-parser": "^1.20.2", "class-transformer": "^0.4.0", "class-validator": "^0.14.0", "dotenv": "^10.0.0", "nestjs-s3": "^1.0.1", "nodemon": "^2.0.20", "passport": "^0.6.0", "passport-jwt": "^4.0.0", "path": "^0.12.7", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "ts-node": "^9.1.1" }, "devDependencies": { "@nestjs/cli": "^9.2.0", "@nestjs/schematics": "^7.3.0", "@nestjs/testing": "^9.3.9", "@types/express": "^4.17.11", "@types/jest": "^26.0.22", "@types/multer": "^1.4.7", "@types/node": "^14.14.36", "@types/supertest": "^2.0.10", "@typescript-eslint/eslint-plugin": "^4.19.0", "@typescript-eslint/parser": "^4.19.0", "eslint": "^7.22.0", "eslint-config-prettier": "^8.1.0", "eslint-plugin-prettier": "^3.3.1", "jest": "^26.6.3", "prettier": "^2.2.1", "prisma": "^4.11.0", "supertest": "^6.1.3", "ts-jest": "^26.5.4", "ts-loader": "^8.0.18", "ts-node": "^9.1.1", "tsconfig-paths": "^3.9.0", "typescript": "^4.2.3" }, "jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "rootDir": "src", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "collectCoverageFrom": [ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", "testEnvironment": "node" } }
Heroku日志
2023-03-04T10:39:37.000000+00:00 app[api]: Build succeeded 2023-03-0410:39:43.776332+00:00 heroku[web.1]: Starting process with command "npm run start:prod" 2023-03-04T10:39:47.341244+00:00 heroku[web.1]: State changed from starting to crashed 2023-03-04T10:39:46.879061+00:00 app [web. 1]: npm WARN config production Use --omit=dev instead. 2023-03-04T10:39:46.938577+00:00 app [web. 1]: 2023-03-04T10:39:46.938579+00:00 app [web. 1]: > dez-backend@0.0.1 start:prod 2023-03-04T10:39:46.938581+00:00 app [web. 1]: > node dist/main 2023-03-04T10:39:46.938581+00:00 app [web. 1]: 2023-03-04T10:39:47.029449+00:00 app [web. 1]: node: internal/modules/cjs/loader: 1078 2023-03-04T10:39:47.029452+00:00 app [web.1]: throw err; 2023-03-04T10:39:47.029452+00:00 app [web. 1]: 2023-03-04T10:39:47.029453+00:00 app [web. 1]: 2023-03-04T10:39:47.029453+00:00 app [web. 1]: Error: Cannot find module '/app/dist/main' 2023-03-04T10:39:47.029453+00:00 app [web. 1]: at Module._resolveFilename (node: internal/modules/cjs/loader: 1075:15) 2023-03-04T10:39:47.029454+00:00 app [web. 1]: at Module._load (node: internal/modules/cjs/loader: 920:27) 2023-03-04T10:39:47.029454+00:00 app[web. 1]: at Function.executeUserEntryPoint [as runMain] (node: internal/modules/run_main:81:12) 2023-03-04T10:39:47.029454+00:00 app [web. 1]: at node: internal/main/run_main_module: 23:47 { 2023-03-04T10:39:47.029455+00:00 app [web. 1]: code: 'MODULE_NOT_FOUND' 2023-03-04T10:39:47.029455+00:00 app [web. 1]: requireStack: [] 2023-03-04T10:39:47.029455+00:00 app [web. 1]: } 2023-03-04T10:39:47.029470+00:00 app [web. 1]: 2023-03-04T10:39:47.029470+00:00 app [web. 1]: Node.js v18.14.2 2023-03-04T10:39:47.292073+00:00 heroku[web. 1]: Process exited with status 1
Procfile
web: npm run start:prod
排查与解决方案
1. 核心问题:Build过程未生成dist目录
Heroku日志显示build成功,但启动时找不到dist/main,大概率是nest build命令未正确执行或执行失败。核心原因是:@nestjs/cli属于dev依赖,Heroku生产环境默认安装依赖时会省略dev包,导致nest build命令无法找到。
2. 修复步骤
方案一:使用Heroku专属钩子完成build
修改package.json中的脚本,利用heroku-postbuild钩子临时安装dev依赖完成编译:
"postinstall": "npx prisma generate", "heroku-postbuild": "npm install --include=dev && npm run build && npm prune --omit=dev"
heroku-postbuild是Heroku专属执行阶段,会在依赖安装后自动运行,临时安装dev依赖完成build后,再清理掉dev包,避免占用资源。
方案二:将@nestjs/cli移至dependencies(快速生效)
直接把@nestjs/cli从devDependencies移到dependencies中,确保生产环境能安装该包,nest build即可正常执行。(此方法不推荐长期使用,会增加生产环境依赖体积)
3. 验证tsconfig.json配置
确认tsconfig.json中outDir设置为"./dist",保证编译产物输出到正确目录:
{ "compilerOptions": { "outDir": "./dist", // 其他配置... } }
4. 适配ES模块启动命令
由于package.json设置了"type": "module",编译后的文件为ES模块,需明确指定入口文件后缀,修改启动命令:
"start:prod": "node dist/main.js"
5. 检查.gitignore配置
确保.gitignore中未排除dist目录(不过Heroku会在build阶段自动生成dist,本地忽略不影响部署)。
内容的提问来源于stack exchange,提问作者Mastertrap
相关产品推荐
相关产品推荐

