nestjs课程框架
太棒了!NestJS 是一个非常优秀且适合构建企业级应用的框架。为新手拟定一个从入门到中级的教程大纲,关键在于循序渐进、理论与实践结合、突出 NestJS 的设计哲学。
以下是一个详细的教程大纲,以**构建一个“博客管理API”**贯穿始终,让读者在实践中掌握知识点:
NestJS 入门到中级教程大纲:构建你的第一个博客API
前言:为什么选择 NestJS?
- 1.1 课程目标与受众
- 目标:让没有 NestJS 经验,但有一定 JavaScript/TypeScript 和 Node.js 基础的开发者,能够独立开发和部署一个中等复杂度的 NestJS API 应用。
- 学完能做什么:掌握 NestJS 核心概念,能开发 RESTful API,理解企业级应用架构。
- 1.2 NestJS 是什么?
- 受 Angular 启发,基于 TypeScript 的渐进式 Node.js 框架。
- 结合了 OOP (面向对象编程)、FP (函数式编程) 和 FRP (函数响应式编程) 的理念。
- 提供开箱即用的模块化、依赖注入、装饰器等特性。
- 1.3 为什么选择 NestJS?
- 强类型:TypeScript 带来的开发体验和可维护性。
- 模块化:清晰的项目结构,易于扩展和维护。
- 依赖注入:降低耦合度,方便测试。
- 一致性:提供统一的架构模式,团队协作效率高。
- 生态丰富:成熟的社区和各种集成方案。
- 1.4 本教程将构建的项目:简单的博客管理API
- 功能:用户管理 (注册、登录)、文章管理 (增删改查)、分类管理 (增删改查)。
第一部分:准备与起步 (Hello NestJS!)
- 2.1 开发环境准备
- 安装 Node.js (推荐 LTS 版本)。
- 安装 npm / yarn。
- 安装 VS Code 及推荐插件 (ESLint, Prettier, TypeScript TSLint Plugin)。
- Git 基础知识。
- 2.2 NestJS CLI 快速开始
- 全局安装 Nest CLI:
npm i -g @nestjs/cli - 创建新项目:
nest new blog-api - 项目结构初探:
src/目录、main.ts、app.module.ts等。 - 运行项目:
npm run start:dev,访问http://localhost:3000
- 全局安装 Nest CLI:
- 2.3 TypeScript 基础快速回顾 (针对性补课)
- 数据类型 (string, number, boolean, array, enum, any, unknown)
- 接口 (Interfaces)
- 类 (Classes)
- 装饰器 (Decorators) 概念及应用 (NestJS 中大量使用)
- 为什么学这个: NestJS 基于 TypeScript,理解其基础是学习 NestJS 的前提。
- 2.4 第一个“Hello World”控制器
- 理解
main.ts中的NestFactory.create()。 - 创建
app.controller.ts和app.service.ts。 @Controller()和@Get()装饰器。- 响应 JSON 数据。
- 学完能干嘛: 能够创建基本的 HTTP 路由和处理函数。
- 理解
第二部分:NestJS 核心概念:基石
- 3.1 模块 (Modules)
@Module()装饰器:imports,controllers,providers,exports。- 模块的组织和作用域。
- 根模块与特性模块。
- 实践: 创建
UserModule、PostModule、CategoryModule。
- 3.2 控制器 (Controllers)
@Controller()装饰器:定义路由前缀。- HTTP 方法装饰器:
@Get(),@Post(),@Put(),@Patch(),@Delete(),@All()。 - 路由参数:
@Param()。 - 查询参数:
@Query()。 - 请求体:
@Body()。 - 自定义状态码:
@HttpCode()。 - 实践: 为
User、Post、Category模块分别创建控制器,定义基本的 CRUD 路由。
- 3.3 提供者 (Providers - Services)
@Injectable()装饰器:标记为可注入的服务。- 服务的职责:封装业务逻辑,与数据源交互。
- 依赖注入 (Dependency Injection):原理与实践 (
constructor注入)。 - 自定义提供者:工厂函数、值提供者、类提供者 (了解)。
- 实践: 为
User、Post、Category模块分别创建 Service,并注入到对应的 Controller。
- 3.4 请求/响应生命周期
- 一个请求在 NestJS 中如何被处理。
- 学完能干嘛: 掌握 NestJS 的核心构建块,能够创建具备基本业务逻辑的模块化应用。
第三部分:数据传输与验证 (API 接口规范与安全)
- 4.1 数据传输对象 (DTOs)
- 为什么要使用 DTOs:限制输入、清晰接口、便于验证。
- 使用 Class 定义 DTOs。
- 实践: 为
User注册/登录、Post创建/更新定义 DTOs。
- 4.2 管道 (Pipes)
- 什么是管道:数据转换和数据验证。
- 内置管道:
ValidationPipe,ParseIntPipe,ParseUUIDPipe。 - 使用
class-validator和class-transformer进行 DTO 验证。 - 全局管道、方法级管道。
- 自定义管道 (了解)。
- 实践: 在
User注册和Post创建接口中应用ValidationPipe进行数据验证。 - 学完能干嘛: 能够规范 API 输入,确保数据的有效性和安全性。
第四部分:增强功能与控制流 (中间件、守卫、拦截器、过滤器)
- 5.1 中间件 (Middleware)
- 与 Express 中间件的对比。
- 实现日志记录中间件。
- 全局中间件与功能模块中间件。
- 实践: 实现一个简单的请求日志记录中间件。
- 5.2 守卫 (Guards)
- 什么是守卫:用于权限控制 (授权),在控制器执行前运行。
@CanActivate()接口。- 路由守卫 (
@UseGuards())。 - 实践: 创建一个简单的
AuthGuard守卫,判断用户是否登录 (暂时只判断是否存在某个 Header)。
- 5.3 拦截器 (Interceptors)
- 什么是拦截器:AOP (面向切面编程),可以绑定额外的逻辑。
- 用途:响应转换、异常映射、缓存、日志记录等。
@Intercept()接口,tap()和map()操作符。- 实践: 实现一个
TransformInterceptor,统一 API 响应格式 (例如{ code: 200, message: "Success", data: {} })。
- 5.4 异常过滤器 (Exception Filters)
- 什么是异常过滤器:捕获并处理未被处理的异常。
@Catch()装饰器。- 全局异常过滤器、控制器/方法级异常过滤器。
- 内置异常 (
HttpException)。 - 自定义异常。
- 实践: 创建一个
AllExceptionsFilter,统一处理所有 HTTP 异常,并返回友好的错误信息。 - 学完能干嘛: 掌握 NestJS 强大的 AOP 特性,实现权限控制、日志、统一响应、统一错误处理等高级功能。
第五部分:数据库集成与持久化 (数据存储)
- 6.1 数据库选择与配置
- 关系型数据库 (PostgreSQL, MySQL, SQLite) 简介。
- 非关系型数据库 (MongoDB) 简介 (了解)。
- 本教程选择:PostgreSQL (或 SQLite 方便学习)。
- 6.2 TypeORM 简介与集成
- 什么是 ORM?为什么使用 TypeORM?
- 安装
@nestjs/typeorm和数据库驱动。 - 配置
app.module.ts中的 TypeORM 连接。 - 实践: 连接到本地 PostgreSQL 数据库。
- 6.3 实体 (Entities) 与数据模型
@Entity()装饰器。- 定义实体字段:
@PrimaryGeneratedColumn(),@Column(),@CreateDateColumn(),@UpdateDateColumn()。 - 一对一、一对多、多对多关系 (了解)。
- 实践: 为
User、Post、Category定义 TypeORM 实体。
- 6.4 仓储 (Repositories) 与基本 CRUD
- 使用
TypeOrmModule.forFeature()注册实体。 - 在 Service 中注入
Repository。 - 基本 CRUD 操作:
save(),find(),findOneBy(),delete()。 - 实践: 将
User、Post、Category模块的 Service 改造为使用 TypeORM 进行数据存储和检索。
- 使用
- 6.5 数据库迁移 (Migrations)
- 为什么需要数据库迁移。
- TypeORM 迁移命令:
typeorm migration:generate,typeorm migration:run。 - 实践: 生成并运行初次迁移,创建
User、Post、Category表。 - 学完能干嘛: 能够将 NestJS 应用与关系型数据库集成,并实现数据的持久化存储与管理。
第六部分:用户认证与授权 (JWT 实现)
- 7.1 认证 (Authentication) 与授权 (Authorization)
- 概念区分与重要性。
- 常见的认证策略:Session、Token (JWT)。
- 为什么选择 JWT。
- 7.2 JWT 基础
- JWT 的构成 (Header, Payload, Signature)。
- 如何生成和验证 JWT。
- 7.3 NestJS 集成 Passport 与 JWT
- 安装
@nestjs/passport,passport,passport-jwt,@nestjs/jwt。 - 7.3.1 登录流程:
- 创建
AuthModule。 AuthService:验证用户,生成 JWT Token。AuthController:提供登录接口。
- 创建
- 7.3.2 注册流程:
UserService:加密密码。UserController:提供注册接口。
- 7.3.3 JWT 策略 (Strategy):
- 创建
JwtStrategy:解析 Token,验证 Payload。 - 注册到
AuthModule。
- 创建
- 7.3.4 保护路由:
- 使用
AuthGuard('jwt')保护Post模块的创建、更新、删除接口。 - 通过
@Request()或@GetUser()(自定义装饰器) 获取当前登录用户。
- 使用
- 实践: 实现用户注册、登录、Token 生成与验证,并保护博客文章的增删改查接口。
- 学完能干嘛: 能够为 NestJS 应用实现一套完整的基于 JWT 的用户认证与授权系统。
- 安装
第七部分:配置与环境管理
- 8.1 配置模块 (
@nestjs/config)- 安装
@nestjs/config。 - 加载
.env文件。 - 环境变量 (development, production)。
- 获取配置项 (
ConfigService)。 - 配置验证 (Joi 或 class-validator)。
- 实践: 将数据库连接 信息、JWT Secret 移到
.env文件,并通过ConfigService获取。 - 学完能干嘛: 更好地管理应用配置,适应不同环境部署。
- 安装
第八部分:测试 (确保应用质量)
- 9.1 NestJS 测试概述
- 单元测试 (Unit Test)、集成测试 (Integration Test)、端到端测试 (E2E Test)。
- Jest 测试框架。
- 9.2 单元测试 (Unit Testing)
- 测试 Service:模拟依赖。
Test.createTestingModule()。beforeEach(),it(),expect()。- 实践: 为
UserService或PostService编写单元测试。
- 9.3 端到端测试 (E2E Testing)
- 测试 Controller 和整个请求/响应流程。
supertest库。- 实践: 为
AuthController或PostsController编写端到端测试。 - 学完能干嘛: 掌握 NestJS 应用的测试方法,确保代码质量和功能正确性。
第九部分:部署与进阶之路
- 10.1 构建生产环境代码
npm run build命令。- 理解编译后的
dist目录 。
- 10.2 部署策略概述 (高层次)
- 使用 PM2 守护进程。
- Docker 容器化部署 (概念,Dockerfile 示例)。
- 云平台部署 (AWS EC2, Heroku, Vercel, Render) 简介。
- 实践: 简单演示如何使用
node dist/main运行生产代码,并介绍 PM2 基本用法。 - 学完能干嘛: 了解 NestJS 应用如何打包和部署,具备将应用上线的能力。
- 10.3 进阶之路 (下一步学习方向)
- WebSocket: 实现实时通信。
- GraphQL: 灵活的 API 查询语言。
- 微服务 (Microservices): NestJS 擅长此领域,TCP/gRPC/Kafka 等传输层。
- CLI 增强: 自定义 Nest CLI 命令、自定义装饰器。
- 监控与日志: 集成 Prometheus, Grafana, ELK。
- 复杂架构模式: CQRS, Event Sourcing。
- 安全性: CORS, Helmet, Rate Limiting。
贯穿整个教程的实践项目:简单的博客API
- 章节设计: 每个章节的实践部分都围绕这个博客API项目进行迭代开发。
- 功能列表:
- 用户模块: 注册、登录、获取个人信息。
- 文章模块: 创建文章、获取文章列表 (分页、筛选)、获取文章详情、更新文章、删除文章。
- 分类模块: 创建分类、获取分类列表、获取分类详情、更新分类、删除分类。
- 技术栈: NestJS, TypeORM, PostgreSQL, JWT。
教程特点:
- 项目驱动: 通过一个实际的博客API项目,将所有知识点串联起来,避免理论枯燥。
- 由浅入深: 从基础概念和环境搭建开始,逐步深入到认证、数据库、测试等中级主题。
- 实践优先: 每个知识点都配备详细的代码示例和实践指导。
- Why & How: 不仅告诉读者“怎么做”,更解释“为什么这样做”,帮助读者理解 NestJS 的设计哲学。
- 前瞻性: 在课程结束时,为读者指明 NestJS 进阶学习的方向。
这个大纲应该能让新手一步步掌握 NestJS,达到中级水平,并为后续更高级的学习打下坚实基础。祝您的教程写作顺利!