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 应用提供了更强大、更灵活的装饰器功能。通过合理地组织和组合装饰器,可以提高代码的可读性、可维护性,并使系统更加模块化和可定制。


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

相关文章
|
8月前
|
设计模式 uml C++
C++中的装饰器模式:灵活地扩展功能
C++中的装饰器模式:灵活地扩展功能
110 0
|
8月前
|
开发者 Python
Python中的装饰器:提升代码灵活性与复用性
在Python编程中,装饰器是一种强大的工具,它可以在不修改原有代码的情况下,为函数或方法添加新的功能。本文将介绍Python中装饰器的基本概念和用法,以及如何利用装饰器提升代码的灵活性与复用性。
|
存储 缓存 JavaScript
不要过度封装!封装一个最简单的Axios!
前言 axios 是目前最优秀的 HTTP 请求库之一,虽然 axios 已经封装的非常好了,我们可以直接拿过来用。但是在实际的项目中,我们可能还需要对 axios 在封装一下,以便我们更好的管理项目和各个借口。 但是,目前网上有特别多的针对于 axios 在项目中的封装。不得不说,很多大佬封装得非常全面,方方面面都考虑到了。但是我们的每个真的都需要那些封装吗?显然不是的,网上的很多封装其实都显得有点过度封装了! 本篇文章实现最简单 Axios 封装,让小伙伴们扩展起来容易一些。
5520 0
不要过度封装!封装一个最简单的Axios!
|
5月前
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
119 0
|
7月前
|
数据安全/隐私保护 Python
Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。
【6月更文挑战第20天】Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。例如,`@simple_decorator` 包装`my_function`,在调用前后添加额外操作。装饰器还能接受参数,如`@logged("INFO", "msg")`,允许动态定制功能。
54 6
|
8月前
|
Java Maven
解决多模块开发中的问题(聚合&继承)
解决多模块开发中的问题(聚合&继承)
121 3
|
8月前
|
缓存 测试技术 开发者
Python中的装饰器:提升函数的灵活性和复用性
在Python编程中,装饰器是一种强大的工具,它可以让我们在不改变原有代码的情况下,对函数进行增强或者修改。本文将介绍Python中装饰器的基本概念,以及如何利用装饰器来提升函数的灵活性和复用性。
|
8月前
|
缓存 API 数据库
Django中的视图装饰器:扩展视图功能的利器
【4月更文挑战第15天】Django视图装饰器用于扩展视图功能,如权限验证、缓存控制和日志记录。它们是Python的高级特性,能不修改原始函数代码就添加新功能。Django提供内置装饰器,如`@login_required`(强制用户登录)、`@cache_page`(缓存视图输出)和`@csrf_protect`(CSRF保护)。同时,开发者可自定义装饰器,例如上面的`timing_decorator`用于记录视图执行时间。使用装饰器时要注意性能影响、执行顺序和参数处理。装饰器增强了代码复用性和可维护性。
|
安全 中间件 开发者
【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)
【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)
416 9
【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)
|
前端开发 JavaScript
如何编写神奇的「插件机制」,优化基于 Antd Table 封装表格的混乱代码
最近在一个业务需求中,我通过在 Antd Table 提供的回调函数等机制中编写代码,实现了这些功能: ✨ 每个层级缩进指示线 ✨ 远程懒加载子节点 ✨ 每个层级支持分页