nest 自定义装饰器

138 阅读1分钟

nest g d role:新建一个名为role 的自定义装饰器文件,在role目录下

自定义装饰器有三种方式

方式一:SetMetadata方式

在role/role.decorator.ts中
import { createParamDecorator, ExecutionContext, SetMetadata,applyDecorators } from '@nestjs/common';
import { Request } from 'express';

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

用法

guard.controller.ts文件中
import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, SetMetadata } from '@nestjs/common';
import { GuardService } from './guard.service';
import { CreateGuardDto } from './dto/create-guard.dto';
import { UpdateGuardDto } from './dto/update-guard.dto';
import {RoleGuard} from './role/role.guard'
// 引入自定义装饰器
import {Role,ReqRul} from './role/role.decorator'

@Controller('guard')
@UseGuards(RoleGuard)
export class GuardController {
  constructor(private readonly guardService: GuardService) {}

  @Get()
  // @SetMetadata('role',['admin'])
  //直接使用,效果与SetMetadata装饰器一样
  @Role('admin')
  findAll() {
    return this.guardService.findAll();
  }

}

方式二:自定义装饰器

在role/role.decorator.ts文件中
import { createParamDecorator, ExecutionContext, SetMetadata,applyDecorators } from '@nestjs/common';
import { Request } from 'express';

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

// 实现一个获取url 的自定义装饰器ReqRul
// data:使用ReqRul装饰器传入的标识,ctx:使用装饰器的上下文
export const ReqRul = createParamDecorator((data:string,ctx:ExecutionContext)=>{
    const req:Request = ctx.switchToHttp().getRequest()
    console.log(data,'data');
    return req.url
})

用法

在在guard.controller.ts文件中
import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, SetMetadata } from '@nestjs/common';
import { GuardService } from './guard.service';
import { CreateGuardDto } from './dto/create-guard.dto';
import { UpdateGuardDto } from './dto/update-guard.dto';
import {RoleGuard} from './role/role.guard'
// 引入自定义装饰器
import {Role,ReqRul} from './role/role.decorator'

@Controller('guard')
@UseGuards(RoleGuard)
export class GuardController {
  constructor(private readonly guardService: GuardService) {}
  @Get()
  // @SetMetadata('role',['admin'])
  @Role('admin')
  //在参数前使用ReqRul装饰器
  findAll(@ReqRul('123') url:string) {
    console.log(url,'url');
    
    return this.guardService.findAll();
  }

}

方式三:聚合装饰器

在role/role.decorator.ts文件中
import { createParamDecorator, ExecutionContext, SetMetadata,applyDecorators } from '@nestjs/common';
import { Request } from 'express';

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

// 实现一个获取url 的自定义装饰器
// data:使用ReqRul装饰器传入的标识,ctx:使用装饰器的上下文
export const ReqRul = createParamDecorator((data:string,ctx:ExecutionContext)=>{
    const req:Request = ctx.switchToHttp().getRequest()
    console.log(data,'data');
    // return req.url
    //使用applyDecorators可以将多个装饰器聚合为一个:applyDecorators(xxx,xxx,xxx)
    return applyDecorators(Role)
})