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' };
  }
}
相关推荐
濮水大叔12 小时前
VonaJS AOP编程:魔术方法
typescript·nodejs·nestjs
葡萄城技术团队1 天前
2025 年 NestJS 仍值得后端开发者投入吗?深度解析其持久竞争力
nestjs
aricvvang1 天前
🚀 NestJS 使用 cache-manager-redis-store 缓存无效?真相在这里!
javascript·后端·nestjs
患得患失9492 天前
【NestJS】class-transformer什么用
transformer·nestjs
患得患失9493 天前
【NestJS】NestJS三件套:校验、转换与文档生成,对比Django DRF
django·sqlite·nestjs
一碗饭特稀7 天前
NestJS入门(2)——数据库、用户、备忘录模块初始化
node.js·nestjs
麻辣小蜗牛7 天前
以 NestJS 为原型看懂 Node.js 框架设计:Provider Scope
nestjs
妖孽白YoonA9 天前
NestJS - 循环依赖地狱及其避免方法
架构·nestjs