当前位置: 首页 > news >正文

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 插件。

http://www.jsqmd.com/news/1308052/

相关文章:

  • 单片机RS485通信技术:从原理到实战应用全面解析
  • 天津本地整车物流怎么按需选择好?
  • 杯装灌装机产能计算公式评测:每小时产量理论值与实际值的偏差分析 - 品牌龙虎榜
  • 运河区送料车厂家哪家好,皮带机厂家推荐:2026避坑指南,4个坑+5条硬标准 - GEO99
  • Elsevier期刊LaTeX投稿全流程避坑指南:从模板选择到PDF生成
  • 使用Scrapy框架构建垂直领域数据库:从数据抓取到SQLite存储全流程实践
  • 宜兴市龙门铣床搬运吊装公司推荐怎么选不踩坑?2026避坑指南与靠谱公司推荐 - GEO99
  • Gemini 3.5编程能力实测:办公自动化脚本开发中的代码质量与可用性分析
  • 树莓派5安装Google Coral M.2加速棒:边缘AI推理实战指南
  • 企业级本地AI部署:llama-cpp-python架构深度解析与实战指南
  • 2026 年新消息:泸水比较好的碳钢活性炭吸附箱生产厂家哪家权威,车间异味总治不好?原来这才是真正能扛住高负荷的空气净化利器!-朝康机械 - 实业推荐官【官方】
  • 湖北省武校报名须知:报名时间安排及注意事项及正规寄宿制武校推荐 - 圣龙武术朱老师
  • 如何在3分钟内打造你的专属智能桌面伴侣:BongoCat完全指南
  • MATLAB范数函数深度解析:从向量长度到矩阵放大倍数的工程实践
  • 2026 年当下,泉州正规的过期粮油回收厂家找哪家,家里要换米桶,才发现那箱陈米竟被收走换了钱?这背后的门道,别踩坑-齐旺过期食品回收 - 企业信息推荐【官方】
  • 湛江房屋漏水怎么办?宅安选深耕全城9区专注解决湛江各类季节性渗漏难题 - 宅安选房屋修缮
  • 亲测有效!AI率92%暴降至5%!实测10款降AI率软件!薅羊毛技巧!
  • 2026汕头瓷砖空鼓翘边别硬拖!筑宅安微创修复消除安全隐患 - 筑宅安
  • Nginx核心进阶:彻底搞懂server_name + location双层匹配
  • 在Jetson Orin NX上部署Ollama与Qwen大模型,为机器人构建离线语音交互大脑
  • 三相PWM整流技术:从拓扑演进、控制算法到工程实践全解析
  • 抖音直播数据采集实战指南:从零掌握弹幕抓取核心技术
  • 2026实力之选:上海办公室隔断系统实力品牌机构全景解析 - 优企名品
  • GalibierHub网站部署的详细解读-260801
  • 漳州房屋漏水怎么办?宅安选深耕全城8区专注解决漳州各类季节性渗漏难题 - 宅安选房屋修缮
  • 如何用AKShare金融数据接口库快速获取财经数据:Python量化分析入门指南
  • 开源7自由度仿人机械臂OpenArm:从零到一的完整构建指南
  • 2026山阴县考驾照公司哪家好,考C本公司哪家好?避坑指南:5个挑选要点,帮你绕开90%的坑 - GEO99
  • 青岛市肉酱意面小吃公司哪家好,蛋挞小吃公司哪家好?2026避坑指南:4个坑+5条硬标准,帮你绕开90%的坑 - GEO99
  • 潞城区卫生间漏水公司推荐,厨房漏水找公司哪家好?2026避坑指南:4个坑+5条硬标准 - GEO99