NestJS之15- 自定义装饰器

557 阅读1分钟

1. 使用自定义装饰器

创建一个装饰器 nest g d role

创建的文件内容 role.decorator.ts

import { SetMetadata } from '@nestjs/common';

export const Role = (...args: string[]) => SetMetadata('role', args);

将上一章的守卫使用自定义装饰器进行替换,使用装饰器@Role进行替换

guard.controller.ts

import { Role } from './role.decorator';

@Get()
@Role('admin') // 自定义名称 数据
findAll() {
  return this.guardService.findAll();
}

2. 自定义参数装饰器

功能是获取传参的url:

import {
  SetMetadata,
  createParamDecorator,
  ExecutionContext,
} from '@nestjs/common';
import type { Request } from 'express';

export const Role = (...args: string[]) => SetMetadata('role', args);

type MyParamOptions = {
  role?: string; // 是否必传参数,默认为 true
  defaultValue?: number; // 默认值
};

export const MyParam = createParamDecorator(
  (options: MyParamOptions, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest<Request>();
    console.log('打印***options', options);
    return request.url;
  },
);

使用

guard.contoller.ts

import { Role, MyParam } from './role.decorator';

  @Get()
  @Role('admin') // 自定义名称 数据
  findAll(@MyParam() param: string) {
    console.log('打印***param', param);
    return this.guardService.findAll();
  }

image.png