如何在 Nest 项目中自定义装饰器

背景

装饰器的作用就像其名字一样,它就像一件华丽的外衣,给你的 NestJS 代码提供了吸引力和可读性。这是因为装饰器可以改变我们对代码的处理方式,并帮助我们实现更高级的编程模式。在本文中,我们将探讨如何创建自定义装饰器,这将大大增强我们的 NestJS 使用体验。

装饰器类型

  • 类装饰器(Class Decorators)

    在NestJS中,类装饰器最常用在控制器和模块定义上,例如 @Controller等。

  • 方法装饰器(Method Decorators)

    在NestJS中,方法装饰器主要用于路由处理,例如**@Get@Post**等。

  • 属性装饰器(Property Decorators)

    在NestJS中,属性装饰器通常用于依赖注入,例如**@Inject**装饰器等。

  • 参数装饰器(Parameter Decorators)

    在NestJS中,参数装饰器一般用于提取请求或路由参数,例如**@Req@Res@Query**等。

自定义四种装饰器

1. 类装饰器

类装饰器在声明前被申明,它接受类的构造函数作为参数。

text
function MyCustomClassDecorator() { return function(constructor: Function) { // 添加自定义逻辑... // 例如,我们可以添加新的属性或方法 } }

创建装饰器后,我们就可以开始使用它。

text
@MyCustomClassDecorator() class MyClass { //... }

2. 属性装饰器

属性装饰器是配合类装饰器一起使用的。你可以在类的属性上使用装饰器,以增加或改变属性的行为。

text
function MyCustomPropertyDecorator(target: any, propertyKey: string) { // 添加自定义逻辑... // 比如,我们可以监听属性值的改变,更改属性的配置等 }

我们来看看如何在类中使用这个装饰器:

text
class MyClass { @MyCustomPropertyDecorator myProperty: string; }

3. 方法装饰器

方法装饰器也非常实用,通常用来改变方法的行为,例如包装方法、纪录日志、更改返回值等。

text
function MyCustomMethodDecorator( target: any, propertyKey: string, descriptor: PropertyDescriptor ) { // 添加自定义逻辑... 根据需要更改或替换原有方法 }

然后,你就可以在你的方法上使用装饰器。

text
class MyClass { @MyCustomMethodDecorator myMethod() { //... } }

4. 参数装饰器

参数装饰器通常用于从请求中提取数据。

text
import { createParamDecorator, ExecutionContext } from '@nestjs/common'; export const MyCustomParamDecorator = createParamDecorator( (data: unknown, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); // 添加自定义逻辑,如提取并返回特定的请求数据 }, );

下面是使用这个自定义参数装饰器的示例:

text
class MyClass { myMethod(@MyCustomParamDecorator data: string) { //... } }

总结

总的来说,创建自定义装饰器是一种强大的技术,让我们的代码变得更加轻量,逻辑更加清晰。理解并使用装饰器是我们深化对 NestJS 的理解,并充分利用其强大功能的关键。尽管本文已经为你介绍了如何创建各种类型的装饰器,确保在实战中正确使用它们仍然是很重要的。

值得注意的是,尽管装饰器具有强大的功能,但应谨慎使用。一个类或函数上过多的装饰器可能会使代码难以阅读和理解,因此在考虑使用装饰器时,请确保它们能让你的代码更加清晰,而不是复杂化。此外,尽管装饰器可以帮助我们实现很多功能,但在很多情况下,更适合的解决方案可能仍是可读性更高、更简单的代码结构和设计模式。