news 2026/1/21 6:27:50

Nestjs 入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nestjs 入门

文章目录

    • 1、安装
      • 创建项目脚手架
      • 运行应用程序
      • 快速生成 `CRUD` 模块
    • 2、核心文件简要概述
    • 3、控制器
    • 4、模块
    • 5、中间件
    • 6、守卫(Guard)—— 鉴权 / 权限
    • 7、拦截器(Interceptor)—— 响应包装 / 日志 / 缓存
    • 8、最简使用示例

NestJS 基于 Express、socket.io 封装的 nodejs 后端开发框架

1、安装

  • Node.js:版本 ≥20(推荐使用最新 LTS 版本)
  • 包管理器:npm(Node.js 自带)、yarn 或 pnpm

创建项目脚手架

npmi -g @nestjs/cli nest new project-name

运行应用程序

npmrun start:dev

快速生成CRUD模块

nest g resource user生成一个基础的 CRUD 功能

nest g mo<name># 生成 modulenest g co<name># 生成 controllernest g s<name># 生成 servicenest g gu<name># 生成 guardnest g pi<name># 生成 pipenest build# 生产编译nest start:prod# 生产运行

2、核心文件简要概述

文件描述
app.controller.ts一个具有单个路由的基本控制器。
app.controller.spec.ts控制器的单元测试。
app.module.ts应用程序的根模块。
app.service.ts一个具有单个方法的基本服务。
main.ts应用程序的入口文件,它使用核心函数NestFactory来创建 Nest 应用程序实例。

3、控制器

  1. 路由

    @Controller():将指定一个可选的路径前缀,这样,我们就不需要为文件中的每个路由重复该路径部分。

  2. 路由参数

    @Get(':id'):当需要接收动态数据作为请求的一部分时,可以在路由路径中添加路由参数标记来捕获 URL 中的动态值。

    @Param():用于修饰方法参数,使得路由参数可以在方法内部通过该装饰参数的属性进行访问。

  3. 路由通配符

    @Get('abcd/*'):路由路径'abcd/*'将匹配abcd/abcd/123abcd/abc等路径。在基于字符串的路径中,连字符(-)和点号(.)会按字面意义解析。

  4. 请求对象

    @Req():需要访问客户端的请求详细信息时,可以通过在处理程序签名中使用@Req()装饰器来指示 Nest 注入请求对象。

  5. 资源

    @Get()@Post()@Put()@Delete()@Patch()@Options()以及@Head()。此外,@All()可定义处理所有这些方法的端点。

  6. 状态码

    @HttpCode(...):响应的默认状态码通常为200,但 POST 请求除外,其默认状态码为201

  7. 响应头

    @Header('Cache-Control', 'no-store')

  8. 重定向

    @Redirect():接收两个可选参数:urlstatusCode。若省略statusCode,其默认值为302Found)。

4、模块

@Module()装饰器采用单个对象,其属性描述模块:

providers将由 Nest 注入器实例化并且至少可以在该模块中共享的提供程序
controllers此模块中定义的必须实例化的控制器集
imports导出此模块所需的提供程序的导入模块列表
exports这个模块提供的 providers 的子集应该在导入这个模块的其他模块中可用。你可以使用提供器本身或仅使用其令牌(provide 值)

每个模块自动成为共享模块。一旦创建,它就可以被任何模块重复使用。假设我们想在多个其他模块之间共享CatsService的实例。为此,我们首先需要通过将该提供者添加到模块的exports数组来导出CatsService,如下所示:

import{Module}from'@nestjs/common';import{CatsController}from'./cats.controller';import{CatsService}from'./cats.service';@Module({controllers:[CatsController],providers:[CatsService],exports:[CatsService]})exportclassCatsModule{}

5、中间件

  • 本质:在请求到达控制器之前,对req/res进行拦截、加工、终止或放行。
  • 接口:必须实现NestMiddlewareuse(req, res, next)方法。
  • 注册位置:只能在模块类configure(consumer: MiddlewareConsumer)方法里绑定,可精细控制路由HTTP 方法

示例:

import{Module,NestModule,RequestMethod,MiddlewareConsumer}from'@nestjs/common';import{LoggerMiddleware}from'./common/middleware/logger.middleware';import{CatsModule}from'./cats/cats.module';@Module({imports:[CatsModule],})exportclassAppModuleimplementsNestModule{configure(consumer:MiddlewareConsumer){consumer.apply(LoggerMiddleware).forRoutes({path:'cats',method:RequestMethod.GET});}}

警告

使用express适配器时,NestJS 应用默认会注册body-parser包中的jsonurlencoded中间件。这意味着如果你想通过MiddlewareConsumer自定义该中间件,就需要在使用NestFactory.create()创建应用时将bodyParser标志设为false来禁用全局中间件。

6、守卫(Guard)—— 鉴权 / 权限

必须实现CanActivate接口。
示例:简易 JWT 守卫(伪代码)

@Injectable()exportclassJwtAuthGuardimplementsCanActivate{canActivate(context:ExecutionContext):boolean{constrequest=context.switchToHttp().getRequest();returnrequest.headers.authorization==='Bearer valid-token';}}

使用:

  • 方法/@UseGuards(JwtAuthGuard)
  • 全局:app.useGlobalGuards(new JwtAuthGuard())

7、拦截器(Interceptor)—— 响应包装 / 日志 / 缓存

实现NestInterceptor接口。
示例:统一包装响应格式

@Injectable()exportclassTransformInterceptor<T>implementsNestInterceptor<T,{data:T}>{intercept(context:ExecutionContext,next:CallHandler){returnnext.handle().pipe(map(data=>({data})));}}

全局注册:

app.useGlobalInterceptors(newTransformInterceptor())

此后所有正常响应都会变成

{"data":...原始内容}

8、最简使用示例

1. 生成 cats 模块

nest g resource cats# 交互选择 REST + 不生成 CRUD → 回车即可

目录结构(自动生成):

src └── cats ├── cats.controller.ts ├── cats.module.ts └── cats.service.ts

2. 代码编写

cats.service.ts

import{Injectable}from'@nestjs/common';@Injectable()exportclassCatsService{privatereadonlycats=['tom','garfield','mimi'];findAll():string[]{returnthis.cats;}}

cats.controller.ts

import{Controller,Get}from'@nestjs/common';import{CatsService}from'./cats.service';@Controller('cats')exportclassCatsController{constructor(privatereadonlycatsService:CatsService){}@Get()findAll(){return{data:this.catsService.findAll()};}}

浏览器 / Postman 访问
http://localhost:3000/cats
返回:

{"data":["tom","garfield","mimi"]}

3. 单元测试

cats.controller.spec.ts(放在src/cats/下)

import{Test,TestingModule}from'@nestjs/testing';import{CatsController}from'./cats.controller';import{CatsService}from'./cats.service';describe('CatsController',()=>{letcontroller:CatsController;letservice:CatsService;beforeEach(async()=>{constmodule:TestingModule=awaitTest.createTestingModule({controllers:[CatsController],providers:[CatsService],}).compile();controller=module.get<CatsController>(CatsController);service=module.get<CatsService>(CatsService);});it('should return cat array',()=>{jest.spyOn(service,'findAll').mockReturnValue(['mock-cat']);expect(controller.findAll()).toEqual({data:['mock-cat']});});});

跑测试:

npmtestcats.controller.spec.ts
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/13 15:07:06

Apache Doris JDBC驱动实战指南:5步实现Java应用高效集成

Apache Doris JDBC驱动实战指南&#xff1a;5步实现Java应用高效集成 【免费下载链接】doris Apache Doris is an easy-to-use, high performance and unified analytics database. 项目地址: https://gitcode.com/gh_mirrors/dori/doris Apache Doris作为一款高性能的分…

作者头像 李华
网站建设 2026/1/17 20:56:23

值返回与引用返回(c++)

目录 值返回 引用返回 二者的区别 生命周期 可以安全引用返回的情况 返回函数参数&#xff08;传入的引用&#xff09; 返回成员变量 返回动态分配的对象&#xff08;但通常是返回指针&#xff09; 禁止返回的类型 返回局部变量 返回临时对象 返回局部指针指向的对象…

作者头像 李华
网站建设 2026/1/4 0:42:26

ForensicsTool电子取证工具:零基础快速上手指南

ForensicsTool电子取证工具&#xff1a;零基础快速上手指南 【免费下载链接】ForensicsTool 简单的取证工具 项目地址: https://gitcode.com/gh_mirrors/fo/ForensicsTool 你是否曾被复杂的电子取证工具吓退&#xff1f;面对那些需要专业背景才能操作的分析软件&#xf…

作者头像 李华
网站建设 2026/1/4 0:42:24

【量子机器学习调试终极指南】:VSCode中你必须掌握的5大核心技巧

第一章&#xff1a;量子机器学习的 VSCode 调试面板在开发量子机器学习应用时&#xff0c;调试是确保算法逻辑与量子线路行为一致的关键环节。Visual Studio Code&#xff08;VSCode&#xff09;凭借其强大的扩展生态系统&#xff0c;成为量子计算开发者首选的集成开发环境之一…

作者头像 李华
网站建设 2026/1/4 0:42:23

【专家亲授】AI Agent上线前必查的7个故障点,错过=挂科!

第一章&#xff1a;AI Agent上线前的故障排查概述在将AI Agent部署至生产环境之前&#xff0c;系统性地识别并解决潜在故障是确保其稳定运行的关键环节。故障排查不仅涉及代码逻辑验证&#xff0c;还需覆盖依赖服务、网络通信、权限配置及资源限制等多个维度。通过构建全面的检…

作者头像 李华