Skip to content

NestJS 项目结构

提示

NestJS 没有强制的项目结构

中大型项目

  • NestJS:提供模块化、依赖注入和 HTTP 请求处理能力。
  • PostgreSQL:持久化业务数据,并提供事务、约束和关系查询能力。
  • Drizzle ORM:使用 TypeScript 定义数据库 Schema,提供类型安全的查询和迁移工具。
  • Redis:存储缓存、会话和限流等需要快速访问或具有有效期的数据。
  • ...
bash
src/
├── main.ts                     # 应用入口
├── app.module.ts               # 根模块
├── config/                     # 应用配置
   ├── env.schema.ts
   ├── app.config.ts
   └── database.config.ts
├── common/                     # 跨模块通用能力
   ├── decorators/
   ├── exceptions/
   ├── filters/                # 全局过滤器
   ├── guards/
   ├── interceptors/           # 全局拦截器
   ├── pipes/
   ├── interfaces/             # 跨模块通用接口
   ├── constants/              # 跨模块通用常量
   └── utils/
├── types/                      # 全局或第三方 .d.ts 声明,按需创建
   ├── express.d.ts
   └── session.d.ts
├── infrastructure/             # 数据库、缓存、日志、存储等内部能力
   ├── database/               # 数据库基础设施
   ├── database.module.ts
   ├── database.provider.ts
   └── schema/             # Drizzle 数据表定义
       ├── users.schema.ts
       └── index.ts
   ├── cache/
   ├── logger/
   └── storage/
├── integrations/               # 外部服务
   ├── payment/
   └── ...
└── modules/                    # 按业务域组织的功能模块
    ├── users/
   ├── dto/                # users 模块专属 DTO
   ├── interfaces/         # users 模块专属接口
   ├── repositories/       # 复杂查询封装,按需创建
   ├── users.module.ts     # users 模块入口
   ├── users.controller.ts # users 模块控制器
   └── users.service.ts    # users 模块服务
    └── ...

模块通过 importsexports 使用其他模块公开的 Provider,不直接引用其他模块的内部文件。基础设施和外部集成只提供技术实现,业务规则仍由功能模块负责。

Drizzle 使用 schema/ 定义数据库表,不需要 TypeORM 风格的 entities/。查询简单时,Service 可以直接注入数据库 Provider,不必创建 Repository。

Drizzle 生成的迁移文件通常保留在项目根目录的 drizzle/ 中;Prisma 则使用 prisma/migrations/。迁移目录遵循所选 ORM 和部署工具的约定,不强制放入 src/

参考

基于 MIT 许可发布