Nest.js 的装饰器 (Decorator) 是什么?

· 约 4 分钟读完 · 第 19 / 144 章

推荐答案

在 Nest.js 中,装饰器(Decorator)是一种特殊的语法,用于修饰类、方法、属性或参数。它们以 @ 符号开头,通常用于添加元数据或修改目标的行为。Nest.js 大量使用装饰器来实现依赖注入、路由定义、请求处理等功能。

例如,@Controller() 用于定义一个控制器类,@Get() 用于定义一个处理 HTTP GET 请求的方法。装饰器使得代码更加简洁和可读,同时提供了强大的功能扩展能力。

本题详细解读

装饰器的基本概念

装饰器是 TypeScript 提供的一种语法特性,允许你在不修改类、方法、属性或参数本身的情况下,通过附加元数据或修改行为来增强它们的功能。Nest.js 利用装饰器来实现许多核心功能,如依赖注入、路由定义、请求处理等。

常见的 Nest.js 装饰器

  1. 类装饰器:

    • @Controller():定义一个控制器类,用于处理 HTTP 请求。
    • @Injectable():定义一个可注入的服务类,通常用于业务逻辑。
  2. 方法装饰器:

    • @Get():定义一个处理 HTTP GET 请求的方法。
    • @Post():定义一个处理 HTTP POST 请求的方法。
    • @Put():定义一个处理 HTTP PUT 请求的方法。
    • @Delete():定义一个处理 HTTP DELETE 请求的方法。
  3. 参数装饰器:

    • @Param():用于获取路由参数。
    • @Query():用于获取查询参数。
    • @Body():用于获取请求体中的数据。
  4. 属性装饰器:

    • @Inject():用于手动注入依赖。

装饰器的工作原理

装饰器本质上是一个函数,它接收目标对象(类、方法、属性或参数)作为参数,并返回一个新的对象或修改后的对象。Nest.js 在启动时会扫描这些装饰器,并根据装饰器的元数据来配置应用程序的行为。

例如,当你在一个类上使用 @Controller('users') 装饰器时,Nest.js 会将该类注册为一个控制器,并将其路由前缀设置为 /users。类似地,当你在一个方法上使用 @Get('profile') 装饰器时,Nest.js 会将该方法注册为处理 /users/profile 路径的 GET 请求。

自定义装饰器

除了使用内置的装饰器,你还可以创建自定义装饰器来满足特定的需求。自定义装饰器通常用于添加额外的元数据或实现特定的逻辑。

例如,你可以创建一个自定义装饰器来记录方法的执行时间:

然后你可以在方法上使用这个装饰器:

总结

装饰器是 Nest.js 中非常强大的工具,它们使得代码更加简洁、可读,并且提供了强大的功能扩展能力。通过理解和使用装饰器,你可以更好地掌握 Nest.js 的核心概念,并编写出更加高效和可维护的代码。