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