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

目录
相关文章
【Vite】Vite设置好了Proxy,但接口却404!解决方案来了!
前言 最近在做一个Vue3+Vite+TypeScript的项目,进行一番网上冲浪后,参考了众多🐴友的方案,配置完vite.config.ts准备开始与后端的同学开始联调,发现无论怎么样都是404,然后就开始了一步步的排查!
6357 0
|
5月前
|
安全 Go 调度
Go同步原语与数据竞争:原子操作(atomic)
本文介绍了Go语言中`sync/atomic`包的使用,帮助避免多goroutine并发操作时的数据竞争问题。原子操作是一种不可中断的操作,确保变量读写的安全性。文章详细说明了常用函数如`Load`、`Store`、`Add`和`CompareAndSwap`的功能与应用场景,并通过并发计数器示例展示了其实现方式。此外,对比了原子操作与锁的优缺点,强调原子操作适用于简单变量的高效同步,而不适合复杂数据结构。最后提醒开发者注意使用场景限制,合理选择同步工具以优化性能。
|
9月前
|
机器学习/深度学习 人工智能 并行计算
量子计算机揭秘:从结构到工作原理的深入探索
量子计算机揭秘:从结构到工作原理的深入探索
264 23
|
8月前
|
数据采集 SQL 人工智能
告别数据混乱:瓴羊Dataphin 通过AI+标准让企业数据“活”起来 | 【瓴羊数据荟】数据MeetUp第四期
AI技术的快速发展促使企业重新审视数据治理的重要性。当前,企业在数据治理中常因指标口径不统一、数据血缘不透明等问题陷入困境。阿里云智能集团瓴羊高级技术专家周鑫提出,以数据标准为核心贯穿数据全生命周期,可有效解决治理难题。
509 15
告别数据混乱:瓴羊Dataphin 通过AI+标准让企业数据“活”起来 | 【瓴羊数据荟】数据MeetUp第四期
|
7月前
|
监控 应用服务中间件 Apache
不同服务器环境301重定向具体实施步骤
本文详细介绍301重定向配置方法,涵盖Apache、Nginx、IIS服务器环境及WordPress、Cloudflare等平台工具的实现方式。提供具体规则示例与操作步骤,包括单页、整站和批量路径重定向。同时,强调验证与监控的重要性,列出测试清单及搜索引擎通知方法,并针对常见问题如重定向循环、参数丢失等提供解决方案。最后总结最佳实践原则,确保SEO权重传递与用户体验优化。
438 17
|
JavaScript 前端开发 安全
|
12月前
|
前端开发 JavaScript
怎么在vite项目中全局导入一个scss文件
在Vite项目中全局导入SCSS文件的方法:通过配置`vite.config.js`中的`css.preprocessorOptions.scss.additionalData`属性,可以将SCSS变量或混合内容全局引入。此方法同样适用于LESS文件。详情参见Vite官方文档。
714 1
怎么在vite项目中全局导入一个scss文件
|
存储 SQL Docker
ClickHouse入门指南:快速搭建与使用
【10月更文挑战第26天】在大数据时代,如何高效地处理海量数据成为了许多企业和开发者的关注点。ClickHouse 是一个开源的列式数据库管理系统(Column-Oriented DBMS),以其出色的查询性能和高并发能力,在数据分析领域迅速崛起。本文将从一个初学者的角度出发,详细介绍如何快速上手 ClickHouse,涵盖从环境搭建到基础操作的全过程。
1517 3
|
资源调度 前端开发 JavaScript
秒懂 Yarn:从安装配置到高效使用的全攻略
秒懂 Yarn:从安装配置到高效使用的全攻略
|
存储 安全 区块链
一文说清楚IPFS分布式存储系统
一文说清楚IPFS分布式存储系统
3628 1