NestJS简明教程——快速配置

NestJS简明教程——快速配置

快速配置

记录 NestJS 项目的初始化、依赖注入、控制器、DTO、数据校验与 API 文档配置。

初始化项目

nest new first-app-g-s

生成项目架构图

使用madge分析模块依赖并生成架构图。

安装

npminstall-gmadge

生成图片

madge--imagegraph.svg ./src/main.ts

依赖注入

依赖关系

在未使用依赖注入时,UserController会自行创建UserService实例:

classUserService{findUser(){return"查询用户";}}classUserController{privateuserService:UserService;constructor(){this.userService=newUserService();}getUser(){returnthis.userService.findUser();}}
UserController │ │ 依赖 ▼ UserService

控制反转(IoC)

传统方式由Controller主动创建Service

Controller │ │ 创建 ▼ Service

使用 IoC 后,由容器负责管理和提供依赖:

IoC 容器 │ │ 注入 ▼ Controller ◀── Service

NestJS 中的依赖注入

提示:依赖注入的核心是IoC 容器。它负责管理类的生命周期和依赖关系。

Service
import{Injectable}from"@nestjs/common";@Injectable()// 表示该类可以由 IoC 容器管理exportclassUserService{findUser(){return"用户数据";}}
Controller
import{Controller,Get}from"@nestjs/common";import{UserService}from"./user.service";@Controller("users")exportclassUserController{constructor(privatereadonlyuserService:UserService){}@Get()getUser(){returnthis.userService.findUser();}}

提示:可在dist目录查看编译后的 JavaScript 文件,了解依赖注入的实现方式。


Controller

生成 Controller

nest g controller todo --no-spec

CRUD 示例

@Controller("todo")exportclassTodoController{constructor(privatereadonlytodoService:TodoService){}@Get()findAll(){returnthis.todoService.findAllTodos();}@Get(":id")findOne(@Param("id")id:string){returnthis.todoService.findOneTodo(Number(id));}@Post()create(@Body()newTodo:any){returnthis.todoService.createTodo(newTodo);}@Patch(":id")update(@Param("id")id:string,@Body()updateTodoBody:any){returnthis.todoService.updateTodo(Number(id),updateTodoBody);}@Delete(":id")deleteTodo(@Param("id")id:string,@Res({passthrough:true})res:Response,){constresult=this.todoService.deleteTodo(Number(id));if(result){return{message:"Todo deleted successfully",};}returnres.status(HttpStatus.BAD_REQUEST).json({message:"bad request",});}}

提示:@Res({ passthrough: true })表示 NestJS 仍会自动将返回值转换为 JSON,因此不需要手动调用res.json()


DTO 与 Entity

推荐使用class定义 DTO:

exportclassCreateTodoDto{title:string;content:string;isCompleted:boolean;}

PartialType可基于已有类型创建新类型,并将原类型的所有属性改为可选:

import{PartialType}from"@nestjs/mapped-types";exportclassUpdateTodoDtoextendsPartialType(CreateTodoDto){}

Pipe:参数校验与转换

安装依赖

pnpmaddclass-validator class-transformer

配置全局验证管道

main.ts中添加:

import{ValidationPipe}from"@nestjs/common";import{NestFactory}from"@nestjs/core";import{AppModule}from"./app.module";asyncfunctionbootstrap(){constapp=awaitNestFactory.create(AppModule);app.useGlobalPipes(newValidationPipe({transform:true,// 自动转换类型,例如将 params 中的 string ID 转为 numberwhitelist:true,// 自动移除 DTO 未声明的属性forbidNonWhitelisted:true,// 请求体含有未声明属性时抛出异常}),);awaitapp.listen(3000);}bootstrap();

为 DTO 添加验证装饰器

// 这里只列出部分常用校验器import{IsBoolean,IsNotEmpty,IsString}from"class-validator";exportclassCreateTodoDto{@IsNotEmpty()@IsString()title!:string;@IsNotEmpty()@IsString()content!:string;@IsNotEmpty()@IsBoolean()isCompleted!:boolean;}

提示:NestJS CLI 可使用以下命令生成 CRUD 资源模板:

nest g resource

API 文档:Swagger

安装依赖

pnpmadd@nestjs/swagger

配置 Swagger

main.ts中添加 Swagger 配置:

import{DocumentBuilder,SwaggerModule}from"@nestjs/swagger";constconfig=newDocumentBuilder().setTitle("Todos example").setDescription("The todo API description").setVersion("1.0").addServer("http://localhost:3000","localhost").addTag("todos").build();constdocumentFactory=()=>SwaggerModule.createDocument(app,config);SwaggerModule.setup("api",app,documentFactory,{jsonDocumentUrl:"swagger/json",});

配置 Swagger CLI 插件

nest-cli.json中添加:

{"$schema":"https://json.schemastore.org/nest-cli","collection":"@nestjs/schematics","sourceRoot":"src","compilerOptions":{"deleteOutDir":true,"plugins":["@nestjs/swagger"]}}

提示:

  • 访问http://localhost:3000/api查看 Swagger 文档。
  • 访问http://localhost:3000/swagger/json查看 Swagger 的 JSON 文档。
  • 使用PartialType时,应从@nestjs/swagger导入。

提高编译速度:SWC

安装依赖

pnpmadd@swc/cli @swc/core-D

配置 SWC

nest-cli.json中添加:

{"compilerOptions":{"builder":"swc","typeCheck":true}}

兼容 Swagger

main.ts中导入新增的元数据文件:

importmetadatafrom"./metadata";awaitSwaggerModule.loadPluginMetadata(metadata);

注意:不推荐同时使用 SWC 构建器与 Swagger CLI 插件。