NestJS简明教程——快速配置
📅 2026/8/1 16:54:06
👁️ 阅读次数
📝 编程学习
快速配置
记录 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 ◀── ServiceNestJS 中的依赖注入
提示:依赖注入的核心是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-specCRUD 示例
@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 resourceAPI 文档: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 插件。
编程学习
技术分享
实战经验