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


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

相关文章
|
存储 消息中间件 架构师
如何估算集群所需的存储、计算资源?
如何估算集群所需的存储、计算资源?
|
SQL 运维 监控
Nest.js 实战 (十):使用 winston 打印和收集日志记录
这篇文章介绍了在Nest服务中如何使用Winston记录日志。文章首先强调了日志记录在后台服务中的重要性,接着提到Nest默认的内部日志记录器,并指出可以通过@nestjs/common包中的Logger类来全面控制日志系统的行为。文章还提到,为了在生产环境中实现更高级的日志功能,可以使用如Winston之类的Node.js日志包。接下来,文章介绍了如何在Nest服务中使用Winston记录日志,包括安装相关依赖、创建winston配置文件以及实现简单的日志记录示例。最后,文章指出更高级的自定义日志功能需要读者自己去探索。
810 0
Nest.js 实战 (十):使用 winston 打印和收集日志记录
|
监控 安全 自动驾驶
|
存储 缓存 安全
【C/C++ 关键字 存储类说明符 】 线程局部变量的魔法:C++ 中 thread_local的用法
【C/C++ 关键字 存储类说明符 】 线程局部变量的魔法:C++ 中 thread_local的用法
782 0
|
存储 缓存 Java
释放C盘空间:释放Windows休眠文件和关闭虚拟内存
在 Windows 11 专业版中,可以通过以下步骤来释放休眠文件(Hibernate File),以释放磁盘空间。休眠文件是系统休眠(Hibernate)功能所需要的文件,它保存了系统的当前状态,以便在休眠状态下恢复。如果你不使用休眠功能,如果因为C盘空间不足,可以考虑释放这个文件来腾出磁盘空间。
27807 1
|
机器学习/深度学习 数据采集 人工智能
【紧跟AI浪潮】深度剖析:如何在大模型时代精准捕获用户心声——提高召回率的实战秘籍
【10月更文挑战第5天】在深度学习领域,大型模型常面临召回率不足的问题,尤其在信息检索和推荐系统中尤为关键。本文通过具体代码示例,介绍如何提升大模型召回率。首先,利用Pandas进行数据预处理,如清洗和特征工程;其次,选择合适的模型架构,如使用PyTorch构建推荐系统;再者,优化训练策略,采用合适的损失函数及正则化技术;此外,选择恰当的评估指标,如召回率和F1分数;最后,通过后处理优化结果展示。以上方法不仅提升召回率,还增强了模型整体性能。
773 0
|
前端开发 JavaScript
react 动态组件知识
【8月更文挑战第30天】react 动态组件知识
393 0
|
安全 网络协议 测试技术
网络工程设计教程系统集成方法第3版-第1章 网络工程设计概述
网络工程设计教程系统集成方法第3版-第1章 网络工程设计概述
442 0
|
JSON Dart 安全
Flutter App混淆加固、保护与优化原理
在移动应用程序开发中,保护应用程序的代码和数据安全至关重要。本文将探讨如何对Flutter应用程序进行混淆、优化和保护,以提高应用程序的安全性和隐私。
|
小程序 JavaScript
微信小程序多点定位marker标点polyline连线
微信小程序多点定位marker标点polyline连线
392 0

热门文章

最新文章