3、创建NestJS项目:使用CLI初始化项目、项目目录结构解析、核心模块介绍

本章将带领你从零开始创建一个标准的 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 项目的核心目录结构与模块间的基本调用关系:

NestJS 项目核心目录结构 src/ main.ts app.module.ts app.controller.ts app.service.ts minio.module.ts minio.controller.ts 说明: • main.ts 启动应用,加载 app.module.ts • app.module.ts 导入 Controller 和 Provider,组织模块

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 之间的协作关系:

NestJS 核心构建块协作关系 Module Controller Provider (Service) 注册 注册 依赖注入 协作流程: 1. Module 注册 Controller 和 Provider → 2. Controller 通过构造函数注入 Provider → 3. Provider 执行业务逻辑

3.5 本章小结

  • 使用 nest new 命令快速初始化 NestJS 项目,CLI 自动生成标准目录结构。
  • src/ 目录包含应用的核心代码:main.ts(入口)、app.module.ts(根模块)、app.controller.ts(控制器)、app.service.ts(服务)。
  • Module 是组织单元,Controller 处理请求,Provider 封装业务逻辑,三者通过依赖注入紧密协作。
  • 后续章节将基于此架构创建 MinIO 专用的模块、控制器和服务,实现对象存储接口。