3. 创建NestJS项目
本章将带领你从零开始创建一个标准的 NestJS 项目,深入解析 CLI 生成的目录结构,并介绍构成 NestJS 应用的三大核心模块:Module、Controller 和 Provider。这是后续实现 MinIO 对象存储接口的基础骨架。
3.1 使用 CLI 初始化项目
NestJS 官方提供了强大的命令行工具 @nestjs/cli,可以快速搭建项目脚手架。请确保你的开发环境中已安装 Node.js(v16 或更高版本)和 npm。
node -v 和 npm -v 确认版本。建议使用 Node.js v18 LTS 或 v20 LTS。
步骤一:全局安装 NestJS CLI
npm install -g @nestjs/cli
步骤二:创建新项目
nest new nest-minio-storage
执行上述命令后,CLI 会提示你选择包管理器(npm / yarn / pnpm)。选择 npm 后,CLI 将自动创建项目目录、安装依赖并初始化 Git 仓库。
步骤三:进入项目并启动开发服务器
cd nest-minio-storage
npm run start:dev
访问 http://localhost:3000,如果看到 "Hello World!" 响应,说明项目初始化成功。
start:dev 模式会监听文件变化并自动重启服务,非常适合开发调试。
3.2 项目目录结构解析
CLI 生成的目录结构遵循模块化、关注点分离的设计原则。下表列出了核心文件和目录的作用:
| 文件/目录 | 作用 |
|---|---|
src/ |
应用源代码根目录,所有业务代码均存放于此 |
src/main.ts |
应用入口文件,负责创建 Nest 应用实例并监听端口 |
src/app.module.ts |
根模块,组织整个应用的模块结构 |
src/app.controller.ts |
根控制器,定义基础路由和请求处理 |
src/app.service.ts |
根服务,封装业务逻辑 |
test/ |
端到端测试文件目录 |
nest-cli.json |
NestJS CLI 配置文件,可自定义构建和编译选项 |
tsconfig.json |
TypeScript 编译配置文件 |
package.json |
项目依赖和脚本管理 |
下图展示了 NestJS 项目的核心目录结构与模块间的基本调用关系:
3.3 核心模块介绍
NestJS 应用由三个核心构建块组成:Module、Controller 和 Provider。理解它们的关系是掌握 NestJS 架构的关键。
3.3.1 Module(模块)
模块是组织代码的基本单元,使用 @Module() 装饰器标记。每个 NestJS 应用至少有一个根模块(AppModule)。模块可以导入其他模块、声明控制器、提供 Provider 以及导出功能。
// app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [], // 导入其他模块
controllers: [AppController], // 注册控制器
providers: [AppService], // 注册 Provider
exports: [], // 导出 Provider 供其他模块使用
})
export class AppModule {}
3.3.2 Controller(控制器)
控制器负责处理传入的 HTTP 请求并返回响应。通过 @Controller() 装饰器定义路由前缀,内部方法使用 @Get()、@Post() 等装饰器绑定具体的 HTTP 方法和路径。
// app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
3.3.3 Provider(提供者)
Provider 是 NestJS 依赖注入的核心,通常用于封装业务逻辑。服务(Service)是最常见的 Provider 类型。通过 @Injectable() 装饰器标记后,NestJS 的 IoC 容器会自动管理其依赖关系。
// app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
MinioModule、MinioController 和 MinioService,它们将遵循完全相同的架构模式。理解这三个核心构建块是掌握 NestJS 开发的基础。
3.4 核心构建块关系图
下图展示了 Module、Controller 和 Provider 之间的协作关系:
3.5 本章小结
- 使用
nest new命令快速初始化 NestJS 项目,CLI 自动生成标准目录结构。 src/目录包含应用的核心代码:main.ts(入口)、app.module.ts(根模块)、app.controller.ts(控制器)、app.service.ts(服务)。- Module 是组织单元,Controller 处理请求,Provider 封装业务逻辑,三者通过依赖注入紧密协作。
- 后续章节将基于此架构创建 MinIO 专用的模块、控制器和服务,实现对象存储接口。