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)
})