返回文章列表 →

Note

装饰器

nestjs装饰器介绍

发布于 更新于

装饰器

装饰器(Decorator)是一种在不直接修改原有代码的情况下,给类、方法、属性或函数增加额外功能的机制,本质是个函数。 可以把它理解为:

在原来的程序外面“包一层”,先做一些事情,再执行原来的逻辑,或者对原来的结果进行处理。

例子

function getUser() {
  console.log("查询用户");
}
// 现在希望每次执行它时,都自动记录执行日志

// 最直接的方法是修改原函数,但这样会把“查询用户”和“记录日志”混在一起:
function getUser() {
  console.log("开始执行 getUser");
  console.log("查询用户");
  console.log("getUser 执行结束");
}

// 装饰器的思路是:日志功能 => 原来的getUser => 日志功能,相当于给getUser套上一层外壳

function withLog(originalFunction) {
  return function (...args) {
    console.log("开始执行");

    const result = originalFunction(...args);

    console.log("执行结束");

    return result;
  };
}

function add(a, b) {
  return a + b;
}

const decoratedAdd = withLog(add);

// 输出:
// 开始执行
// 执行结束
// 3
console.log(decoratedAdd(1, 2));

// 其中:add为原函数,withlog是装饰器,decoratedAdd是装饰后的函数。装饰器没有改变 add 内部的代码,但给它增加了日志功能

装饰器常见作用

用途 说明
日志记录 记录方法什么时候执行、参数是什么
权限校验 执行方法前检查用户是否登录或有权限
性能统计 统计函数运行了多长时间
缓存 相同参数直接返回之前的结果
参数校验 检查参数类型、必填字段
异常处理 统一捕获和记录错误
防抖节流 限制方法调用频率
事务管理 数据库操作前开启事务,结束后提交或回滚
依赖注入 由框架自动创建和注入对象
路由注册 将某个方法注册为 HTTP 接口

NestJS中的装饰器

ES2016 装饰器是一个返回函数的表达式,可以接收目标对象、名称和属性描述符作为参数。使用时需要在装饰目标上方添加 @ 字符前缀。装饰器可以定义在类、方法或属性上,给它们添加元数据

装饰器的执行时机

装饰器一般在类被定义、模块被加载时执行,而不是每次收到 HTTP请求 时执行

装饰器顺序

TypeScript 属性装饰器是从靠近属性的位置向上注册的,所以靠近属性的装饰器先被执行

  @Length(3, 7, {message:"名字长度需要再3~7之间"})
  @IsString({ message: "名字必须是字符串" })
  @Type(() => String)
  @IsNotEmpty({ message: "名字不能为空" })
  name: string;

  // 执行顺序:@IsNotEmpty => @Type() => @IsString() => @Length()