nestjs中的SetMetadata用法

SetMetadata 是 NestJS 中一个非常重要且强大的装饰器,它属于元数据编程 的核心部分。

简单来说,它的主要功能是:在某个目标上(比如 Controller 类或 Handler 方法)"贴标签"或"附加自定义信息"

这些"标签"或"信息"本身不会做任何事,但可以被其他部分的代码(如 Guard、Interceptor、Filter)读取,并根据这些信息来执行不同的逻辑。


🎯 核心功能:创建自定义的"标记"

想象一下,你有一个安检系统(Guard),需要检查哪些地方是"VIP区域",只允许"VIP用户"进入。

  • 问题:你如何告诉安检系统,哪个路由是"VIP区域"?
  • 解决方案 :用 SetMetadata 在那个路由的处理函数上贴一个 isVip: true 的标签。

SetMetadata 就是用来创建这个标签的工具。


🛠️ 如何使用 SetMetadata

SetMetadata 通常不直接使用,而是封装在一个自定义装饰器里,这样更清晰、更易于复用。

第 1 步:定义一个元数据的 Key

首先,定义一个常量作为你的"标签"名称,避免写错字符串。

arduino 复制代码
// src/decorators/public.decorator.ts (或者 constants.ts)
export const IS_PUBLIC_KEY = 'isPublic';

第 2 步:创建自定义装饰器

然后,创建一个自定义装饰器,内部调用 SetMetadata

javascript 复制代码
// src/decorators/public.decorator.ts
import { SetMetadata } from '@nestjs/common';

export const IS_PUBLIC_KEY = 'isPublic';

/**
 * 一个标记路由为公开的装饰器,跳过认证
 */
export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);

现在,你就拥有了一个 @Public() 装饰器。它做的事情就是:在它所装饰的目标上,设置一个名为 isPublic 的元数据,值为 true

第 3 步:使用自定义装饰器

现在你可以在任何 Controller 或 Handler 方法上使用这个装饰器了。

less 复制代码
// src/auth/auth.controller.ts
import { Controller, Get } from '@nestjs/common';
import { Public } from '../decorators/public.decorator';

@Controller('auth')
export class AuthController {
  
  @Public() // <-- 使用我们的自定义装饰器
  @Get('login')
  login() {
    // 这个登录接口不需要认证,是公开的
    return { message: 'This is a public login route' };
  }

  @Get('profile')
  getProfile() {
    // 这个接口需要认证
    return { message: 'This is a protected route' };
  }
}
相关推荐
Mr_li12 小时前
NestJS 集成 TypeORM 的最优解
node.js·nestjs
前端付豪2 天前
Nest 项目小实践之注册登陆
前端·node.js·nestjs
Mr_li2 天前
手摸手,教你如何优雅的书写 NestJS 服务配置
node.js·nestjs
Jiude3 天前
AI 全栈时代的工程化护栏:Vben-Nest 让 Mock 契约落地成真实后端
前端·后端·nestjs
折七3 天前
NestJS 用了两年,我换了这个
typescript·node.js·nestjs
NEXT0610 天前
深度解析 JWT:从 RFC 原理到 NestJS 实战与架构权衡
前端·typescript·nestjs
明月_清风13 天前
从“搬运工”到“指挥官”:通过 IoC 容器重塑你的后端思维
后端·nestjs
UIUV14 天前
实现RAG功能学习笔记
react.js·langchain·nestjs
None32117 天前
【NestJs】如何使用Prisma实现@Transactional装饰器开启事务并且跨Service传递
nestjs
前端付豪19 天前
Express 如何使用 multer 文件上传?
前端·node.js·nestjs