You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:53:12