流程图javaandroidnestJS

一文搞懂 NestJS 装饰器:类装饰器 vs 方法装饰器(附全景流程图)

文章浏览阅读1.2k次,点赞25次,收藏15次。NestJS的装饰器体系是其核心特性之一。文章通过类装饰器(如@Controller、@Injectable)和方法装饰器(如@Get、@Post)的对比,通俗易懂地解释了两者的区别:类装饰器用于标记和改造整个类,而方法装饰器则专注

2025-08-10·阅读约 6 分钟·计算中...
一文搞懂 NestJS 装饰器:类装饰器 vs 方法装饰器(附全景流程图)

NestJS 的魅力之一,就是它的装饰器(Decorator)体系
常见的有 @Controller()@Injectable()@Get()@Post()
但是很多新手会混淆:类装饰器方法装饰器 到底有什么区别?
今天我们用通俗易懂的语言 + 图文,帮你一次搞清楚。
在这里插入图片描述


1️⃣ 装饰器是什么?

装饰器本质上就是一个函数,用来给类、方法、属性、参数加上"元数据"或"额外行为"。

📌 类比
>
就像给建筑物贴标签、加功能模块,让别人(或者框架)知道它的作用,并在合适的时机触发它。


2️⃣ 类装饰器(Class Decorator)

✅ 概念

  • 贴在上的装饰器
  • 用于标记、注册或改造整个类
  • NestJS 用它来识别 控制器服务模块

💻 代码示例

import { Controller, Injectable } from '@nestjs/common';

@Controller('users') // 类装饰器
export class UserController {
  // ...
}

@Injectable() // 类装饰器
export class UserService {
  // ...
}

🏠 生活类比

类装饰器就像给整栋楼挂招牌\

  • @Controller('users') → “这是用户服务楼,入口是 /users”\
  • @Injectable() → “这是工具楼,别人可以直接来用”

3️⃣ 方法装饰器(Method Decorator)

✅ 概念

  • 贴在类方法上的装饰器
  • 用于绑定路由、添加拦截、权限控制等功能

💻 代码示例

import { Controller, Get, Post } from '@nestjs/common';

@Controller('users')
export class UserController {

  @Get() // 方法装饰器
  findAll() {
    return '返回所有用户';
  }

  @Post()
  createUser() {
    return '创建用户';
  }
}

🚪 生活类比

方法装饰器就像给楼里的某个门贴标签\

  • @Get() → 这是 GET 请求的门\
  • @Post() → 这是 POST 请求的门\
  • @UseGuards(AuthGuard) → 进门前要刷门禁卡

4️⃣ 类装饰器 vs 方法装饰器 对比表


对比项 类装饰器 方法装饰器


作用对象 整个类 类中的某个方法

常见用途 标记控制器、服务、模块 绑定路由、加权限、加拦截

执行时机 类定义完成时 类定义完成时(方法级)

NestJS例子 @Controller()@Injectable() @Get()@Post()@UseGuards()

生活类比 挂招牌 门口贴标签


5️⃣ 请求流中的类装饰器 & 方法装饰器

客户端发起 HTTP 请求

路由解析

类装饰器 @Controller()
确定控制器和路由前缀

方法装饰器 @Get()/@Post()
绑定具体请求方法和路径

参数装饰器 @Body() / @Param()
获取并验证请求数据

Controller 方法执行
调用 Service

类装饰器 @Injectable()
Service 被自动注入

业务逻辑 & 数据库交互

返回结果

方法装饰器(可附加拦截器/守卫)
格式化或限制响应

响应返回客户端


6️⃣ NestJS 装饰器全景地图

客户端发起 HTTP 请求

Middleware 中间件
非装饰器,处理日志/CORS/解析 Body

Guards 守卫 (类/方法级)
@UseGuards() 权限验证

Interceptors 前置 (类/方法级)
@UseInterceptors() 请求拦截

Pipes 管道 (参数级)
@Body() / @Param() / @Query() 验证与转换

Controller 方法
类装饰器 @Controller()
方法装饰器 @Get() / @Post()

Service 执行
类装饰器 @Injectable()
属性装饰器 @Inject() 指定注入

Repository / 外部 API 调用

返回 Controller

Interceptors 后置 (类/方法级)
格式化响应 / 映射 DTO

Exception Filters 异常过滤器
@Catch() 统一异常处理

响应返回客户端


7️⃣ 总结记忆法

  • 类装饰器 → “这是什么楼”\
  • 方法装饰器 → “楼里的哪道门”\
  • 属性装饰器 → “房间里的家具从哪来”\
  • 参数装饰器 → “门口进来的包裹怎么拆”

💡 记住这个类比,你在写 NestJS 时就不会混淆它们了。

订阅 FreeMac

每周精选:Mac 高效技巧、免费替代付费软件、开发者工具推荐。用对你的 MacBook,省钱 + 提效。