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()