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,然后就开始了一步步的排查!
6456 0
|
7月前
|
安全 Go 调度
Go同步原语与数据竞争:原子操作(atomic)
本文介绍了Go语言中`sync/atomic`包的使用,帮助避免多goroutine并发操作时的数据竞争问题。原子操作是一种不可中断的操作,确保变量读写的安全性。文章详细说明了常用函数如`Load`、`Store`、`Add`和`CompareAndSwap`的功能与应用场景,并通过并发计数器示例展示了其实现方式。此外,对比了原子操作与锁的优缺点,强调原子操作适用于简单变量的高效同步,而不适合复杂数据结构。最后提醒开发者注意使用场景限制,合理选择同步工具以优化性能。
|
11月前
|
机器学习/深度学习 人工智能 并行计算
量子计算机揭秘:从结构到工作原理的深入探索
量子计算机揭秘:从结构到工作原理的深入探索
306 23
|
10月前
|
数据采集 SQL 人工智能
告别数据混乱:瓴羊Dataphin 通过AI+标准让企业数据“活”起来 | 【瓴羊数据荟】数据MeetUp第四期
AI技术的快速发展促使企业重新审视数据治理的重要性。当前,企业在数据治理中常因指标口径不统一、数据血缘不透明等问题陷入困境。阿里云智能集团瓴羊高级技术专家周鑫提出,以数据标准为核心贯穿数据全生命周期,可有效解决治理难题。
608 15
告别数据混乱:瓴羊Dataphin 通过AI+标准让企业数据“活”起来 | 【瓴羊数据荟】数据MeetUp第四期
|
9月前
|
监控 应用服务中间件 Apache
不同服务器环境301重定向具体实施步骤
本文详细介绍301重定向配置方法,涵盖Apache、Nginx、IIS服务器环境及WordPress、Cloudflare等平台工具的实现方式。提供具体规则示例与操作步骤,包括单页、整站和批量路径重定向。同时,强调验证与监控的重要性,列出测试清单及搜索引擎通知方法,并针对常见问题如重定向循环、参数丢失等提供解决方案。最后总结最佳实践原则,确保SEO权重传递与用户体验优化。
519 17
|
9月前
|
安全
员工总在找领导签字?点晴移动OA实现全员"零跑腿"办公
“张总,这份合同需要您签字!” “王经理,报销单麻烦批一下!” “李总监,请假申请您还没批,我这边着急……” 这样的场景是否每天都在你的企业上演?员工疲于跑腿找领导签字,管理层被琐碎审批缠身,业务流程卡在“最后一公里”。传统纸质审批不仅效率低下,还可能导致文件丢失、流程延误,甚至影响业务推进。 如何破解这一管理困局?点晴移动OA系统,通过智能化、无纸化、移动化办公,让审批流程“跑”起来,真正实现**全员“零跑腿”办公!
318 1
|
9月前
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
424 11
|
9月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
465 10
|
前端开发 JavaScript
怎么在vite项目中全局导入一个scss文件
在Vite项目中全局导入SCSS文件的方法:通过配置`vite.config.js`中的`css.preprocessorOptions.scss.additionalData`属性,可以将SCSS变量或混合内容全局引入。此方法同样适用于LESS文件。详情参见Vite官方文档。
806 1
怎么在vite项目中全局导入一个scss文件
|
存储 SQL Docker
ClickHouse入门指南:快速搭建与使用
【10月更文挑战第26天】在大数据时代,如何高效地处理海量数据成为了许多企业和开发者的关注点。ClickHouse 是一个开源的列式数据库管理系统(Column-Oriented DBMS),以其出色的查询性能和高并发能力,在数据分析领域迅速崛起。本文将从一个初学者的角度出发,详细介绍如何快速上手 ClickHouse,涵盖从环境搭建到基础操作的全过程。
1725 3

热门文章

最新文章