22_自定义装饰器

简介: 22_自定义装饰器

除了内置装饰器外,nest.js也允许我们自定义装饰器进行模块化功能开发,这里我们还是以SetMetadata为例子

不要忘记装饰器的本质,装饰器就是一个函数,在通过@符号调用时会往参数列表里加入一些特定的属性

  1. 创建一个自定义装饰器 nest g d roles
import { SetMetadata,ExecutionContext } from '@nestjs/common';
// 方法装饰器
export const Roles = (...args: string[]) => SetMetadata('roles', args);

创建好后可以看到这个方法,调用这个方法后会执行SetMetadata函数,定义一个路由元信息。我们在上一节注册的守卫在这一节仍然有用,不能删除

  1. 在controller里注册
import { ReqUrl, Roles } from 'src/roles/roles.decorator';
@Controller('login')
export class LoginController {
  constructor(private readonly loginService: LoginService) {}
  
  @Get()
  @Roles('admin')
  @UseGuards(RoleGuard)
  findAll() {
    return reqUrl;
  }
}

守卫内容稍作修改

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
import { Reflector } from '@nestjs/core';
import { Request } from 'express';
@Injectable()
export class RoleGuard implements CanActivate {
  constructor(private Reflector:Reflector){}
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    // 反射的属性改为roles
    const admin = this.Reflector.get<string[]>('roles',context.getHandler())
    console.log('通过了守卫',admin)
    const req = context.switchToHttp().getRequest<Request>()
    if(admin.includes(req.query.roles as string)){
      return true
    }else{
      return false
    }
    console.log(admin)
    return true
  }
}

我们也可以自行创建一个属性装饰器

import { SetMetadata,ExecutionContext } from '@nestjs/common';
// 引入createParamDecorator函数
import { createParamDecorator } from '@nestjs/common';
import { Request } from 'express';
// createParamDecorator接受一个回调函数,该回调有两个参数,第一个data是我们调用装饰器时传入的参数,第二个是ExecutionContext类
export const ReqUrl = createParamDecorator((data:string,context:ExecutionContext) => {
  // 获取请求信息
    const req = context.switchToHttp().getRequest<Request>()
    console.log('自定义属性装饰器======>',data)
    return req.url
})

在controller中使用

@Controller('login')
export class LoginController {
  constructor(private readonly loginService: LoginService) {}
  @Get()
  @Roles('admin')
  @UseGuards(RoleGuard)
    // 使用装饰器并传入参数
  findAll(@ReqUrl('哈哈哈') reqUrl) {
    return reqUrl;
  }
}

以上,当我们访问localhost:3000/login时控制台就会输出'哈哈哈'并在页面上返回请求的url信息

目录
相关文章
|
1月前
|
JavaScript
03_装饰器
03_装饰器
50 1
|
10月前
|
JavaScript 前端开发 编译器
StencilJs 学习之组件装饰器
Stencil 是一个生成 Web Components(更确切地说,是自定义元素)的编译器。Stencil 将最流行的框架的最佳概念结合到一个简单的构建时工具中。 现在让我们一起学习其中的装饰器部分。
71 0
|
1月前
|
数据安全/隐私保护 Python
解释装饰器(decorator)的功能和用法。
解释装饰器(decorator)的功能和用法。
|
Python
一日一技:装饰器如何装饰异步函数
一日一技:装饰器如何装饰异步函数
121 0
|
10月前
|
关系型数据库 MySQL 数据安全/隐私保护
nest自定义验证类及自定义验证装饰器
nest自定义验证类及自定义验证装饰器
|
11月前
|
Python
python装饰器中的4种类型(函数装饰函数、函数装饰类、类装饰函数、类装饰类)
python装饰器中的4种类型(函数装饰函数、函数装饰类、类装饰函数、类装饰类)
95 0
|
Python
Python 装饰器装饰类中的方法
Python 装饰器装饰类中的方法
74 0
|
存储 JavaScript 前端开发
装饰器语法
利用typeof判定类型的取值范围是:'undefined' /'boolean' /'string' /'number' /'object' /'function' /'symbol' 在JavaScript内部使用typeof判断类型依据的是二进制,根据变量的机器码低位1-3位存储其类型信息,有如下规则:
87 0
|
开发者 Python
装饰器高级使用(了解)
装饰器高级使用(了解)
64 0
装饰器高级使用(了解)
|
JSON 数据格式
装饰器的实际应用
使用装饰器模式改造slf4j打印json格式日志
709 0
装饰器的实际应用