nestjs装饰器聚合,让你的代码更加灵活,复用

简介: nestjs装饰器聚合,让你的代码更加灵活,复用

什么是装饰器聚合

在 Nest.js 中,装饰器聚合(Decorator composition)是一种技术,通过将多个装饰器组合在一起形成一个装饰器链,以便在一个项(类、方法或参数)上应用多个装饰器的功能。装饰器聚合可以使代码更模块化、可复用,并且提高了装饰器的灵活性。


通过装饰器聚合,可以按照一定的顺序应用多个装饰器,每个装饰器都可以在不影响其他装饰器功能的情况下添加、修改或扩展特定项的行为。


装饰器聚合有什么用

复用性: 通过装饰器聚合,你可以将不同的装饰器组合在一起,形成一个可重复使用的装饰器链。这样,你可以定义一系列通用的装饰器,并在需要时根据需求组合它们。


模块化: 装饰器聚合使得装饰器可以更细粒度地应用于不同的部分。通过将多个装饰器应用于一个项,你可以将不同的关注点和功能分离。每个装饰器可以专注于一个特定的任务,从而提高代码的可读性和可维护性。


灵活性: 装饰器聚合允许你按照一定的顺序应用装饰器,以满足特定的需求。你可以定义不同的装饰器链,每个链上的装饰器顺序不同,可以根据需求轻松定制项的行为。


扩展性: 装饰器聚合允许你轻松地扩展已经存在的装饰器功能。如果你想要对一个项的行为进行修改或添加额外功能,只需在聚合装饰器链中添加新的装饰器即可,而不需要修改已有的装饰器。


项目中使用

在昨天的Guard案例中,我们拿身份校验这个例子来说,目前我们控制器身上已经绑定了3个装饰器,这个路由装饰器可以先不看,接下来,我们再为其绑定个管道


image.png


这个是一个将密码转化为number类型的管道,管道具体用法请看我之前写的管道验证那篇

image.png

至此我们的这个上传的路由身上已经绑定了好几个装饰器了,看着是不是很冗余

image.png

通过命令行创建一个装饰器


nest g d roleAuth
import { UseGuards, UsePipes, applyDecorators } from '@nestjs/common';
import { AuthGuard } from '../auth/auth.guard';
import { Role } from '../role/role.decorator';
import { MengPipe } from '../meng/meng.pipe';
export const RoleAuth = (...args: string[]) => {
    return applyDecorators(
        Role(...args),
        UseGuards(AuthGuard),
        UsePipes(MengPipe)
    )
}

接着通过关键的applyDecorators方法,将这些装饰器聚合在一起,要注意一点,因为Guard(守卫)的权限比pipe管道,拦截器等要高,所以这俩的顺序,调了也无效,在其他场景中可能对于不同的顺序,产生的效果也不一样,这个跟实际需求相关了


回到controller,为其绑定上我们聚合后的装饰器,相对于刚刚那一大堆,是不是简化了许多,这样也符合模块化,我们将实现特定功能的不同类聚合在一起最后统一导出,封装成一个一个的模块,另外对于这个管道如果我们要做dto验证,可能不止这一个地方应用了,在其他模块中也使用了,我们又可以结合其他类的功能将其封装成其他装饰器这样也达到了复用效果


image.png


总结

装饰器聚合为 Nest.js 应用提供了更强大、更灵活的装饰器功能。通过合理地组织和组合装饰器,可以提高代码的可读性、可维护性,并使系统更加模块化和可定制。


使用的时候要注意一点:包中的装饰器不可组合,无法与函数正常工作!!!

相关文章
|
4月前
|
前端开发
Axios request 封装技巧:提升代码复用和效率的步骤
在开发中,为了提高效率,通常对 Axios 进行封装,简化了请求的发送和对响应的处理。同时,统一错误处理机制有助于维护代码的清晰和一致性。本文介绍了一些高效封装 Axios 请求的方法。
Axios request 封装技巧:提升代码复用和效率的步骤
|
4月前
|
开发者 Python
Python中的装饰器:提升代码灵活性与复用性
在Python编程中,装饰器是一种强大的工具,它可以在不修改原有代码的情况下,为函数或方法添加新的功能。本文将介绍Python中装饰器的基本概念和用法,以及如何利用装饰器提升代码的灵活性与复用性。
|
11月前
|
SQL 关系型数据库 Go
Go语言微服务框架 - 12.ORM层的自动抽象与自定义方法的扩展
随着接口参数校验功能的完善,我们能快速定位到接口层面的参数问题;而应用服务的分层代码,也可以通过log的trace-id发现常见的业务逻辑问题。 但在最底层与数据库的操作,也就是对GORM的使用,经常会因为我们不了解ORM的一些细节,导致对数据的CRUD失败,或者没有达到预期效果。这时,我们希望能在ORM这一层也有一个通用的解决方案,来加速问题的排查。
74 0
|
存储 缓存 JavaScript
不要过度封装!封装一个最简单的Axios!
前言 axios 是目前最优秀的 HTTP 请求库之一,虽然 axios 已经封装的非常好了,我们可以直接拿过来用。但是在实际的项目中,我们可能还需要对 axios 在封装一下,以便我们更好的管理项目和各个借口。 但是,目前网上有特别多的针对于 axios 在项目中的封装。不得不说,很多大佬封装得非常全面,方方面面都考虑到了。但是我们的每个真的都需要那些封装吗?显然不是的,网上的很多封装其实都显得有点过度封装了! 本篇文章实现最简单 Axios 封装,让小伙伴们扩展起来容易一些。
5125 0
不要过度封装!封装一个最简单的Axios!
|
1月前
|
设计模式 存储 前端开发
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
|
1月前
|
API
浅谈 Vue3 的模块拆分与 API 重写
浅谈 Vue3 的模块拆分与 API 重写
|
3月前
|
数据安全/隐私保护 Python
Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。
【6月更文挑战第20天】Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。例如,`@simple_decorator` 包装`my_function`,在调用前后添加额外操作。装饰器还能接受参数,如`@logged("INFO", "msg")`,允许动态定制功能。
28 6
|
4月前
|
缓存 测试技术 开发者
Python中的装饰器:提升函数的灵活性和复用性
在Python编程中,装饰器是一种强大的工具,它可以让我们在不改变原有代码的情况下,对函数进行增强或者修改。本文将介绍Python中装饰器的基本概念,以及如何利用装饰器来提升函数的灵活性和复用性。
|
4月前
|
前端开发 BI API
API函数式组件封装逻辑
API函数式组件封装逻辑
33 0
|
4月前
模块功能复用和扩展性
模块功能复用和扩展性 模块功能复用和扩展性是软件工程中的重要概念,主要体现在设计和实现阶段。
64 1