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信息

目录
相关文章
|
编译器 C#
c# 自定义扩展方法
c# 自定义扩展方法
|
JavaScript 前端开发 编译器
StencilJs 学习之组件装饰器
Stencil 是一个生成 Web Components(更确切地说,是自定义元素)的编译器。Stencil 将最流行的框架的最佳概念结合到一个简单的构建时工具中。 现在让我们一起学习其中的装饰器部分。
122 0
|
9月前
|
数据安全/隐私保护 Python
解释装饰器(decorator)的功能和用法。
解释装饰器(decorator)的功能和用法。
64 1
|
JavaScript
TypeScript-类方法修饰符和TypeScript-类可选属性和参数属性
TypeScript-类方法修饰符和TypeScript-类可选属性和参数属性
77 0
|
关系型数据库 MySQL 数据安全/隐私保护
nest自定义验证类及自定义验证装饰器
nest自定义验证类及自定义验证装饰器
|
Python
python装饰器中的4种类型(函数装饰函数、函数装饰类、类装饰函数、类装饰类)
python装饰器中的4种类型(函数装饰函数、函数装饰类、类装饰函数、类装饰类)
136 0
|
JavaScript 编译器 索引
如何在 TypeScript 中为对象动态添加属性?
如何在 TypeScript 中为对象动态添加属性?
1117 0
|
Python
Python 装饰器装饰类中的方法
Python 装饰器装饰类中的方法
102 0
|
JavaScript 前端开发 索引
装饰器语法
@decorator 装饰器是 es7 更新的提案,是一种与类相关的语法,用来注释或修改类和类的方法,是在装饰器模式的基础上产生的。装饰器是过去几年中js最大的成就之一,已是ES7的标准特性之一。
122 0
|
开发者 Python
装饰器高级使用(了解)
装饰器高级使用(了解)
装饰器高级使用(了解)

热门文章

最新文章