管道
管道是参数装饰器的内部机制,可以在参数装饰器逻辑之后执行一些自定义代码,一般用于以下的场景:
- 1、数据的校验
- 2、参数的转换
组件提供的管道
@midwayjs/validate
默认提 供了验证管道,只需要启用组件即可使用。
例如:
@Controller('/api/user')
export class HomeController {
@Post('/')
async updateUser(@Body() user: UserDTO ) {
// ...
}
}
@Body
装饰器已经被自动注册了 ValidatePipe
,如果 UserDTO
是一个已经经过 @Rule
装饰器修饰的 DTO,会自动校验并转换。
如果使用了基础类型,则也可以通过数据转换管道进行校验和转换。
例如:
import { ParseIntPipe } from '@midwayjs/validate';
@Controller('/api/user')
export class HomeController {
@Post('/update_age')
async updateAge(@Body('age', [ParseIntPipe]) age: number ) {
// ...
}
}
ParseIntPipe
管道可以将字符串,数字数据转换为数字,这样从请求参数获取到的 age
字段则会通过管道的校验并转换为数字格式。
除此之外,还提供了 ParseBoolPipe
,ParseFloatPipe
等更多数据转换管道,具体请查看 Validate 组件。
自定义管道
管道可以是一个实现 PipeTransform
接口的类或者方法,我们一般将管道放在 src/pipe
目录。
比如:
// src/pipe/validate.pipe.ts
import { Pipe, PipeTransform, TransformOptions } from '@midwayjs/core';
@Pipe()
export class ValidatePipe implements PipeTransform<T, R> {
transform(value: T, options: TransformOptions): R {
return value;
}
}
PipeTransform<T, R>
是每个管道必须要实现的泛型接口。泛型 T
表明输入的 value
的类型,R
表明 transfrom()
方法的返回类型。
为实现 PipeTransfrom
,每个管道必须声明 transfrom()
方法。该方法有两个参数:
value
options
value
是当前处理的参数值,options
是当前处理的选项,包含以下属性。
export TransformOptions<OriginType = unknown> {
metaType: TSDesignType<OriginType>;
metadata: Record<string, any>;
target: any;
methodName: string;
}
参数 | 描述 |
---|---|
metaType | 一个 ts 元数据类型的解析对象,包含 name 、originDesign 、isBaseType 三个属性。 |
metadata | 参数装饰器的元数据对象 |
target | 当前装饰的实例本身 |
methodName | 当前参数装饰器装饰器的方法名 |
绑定管道
管道必须依附在参数装饰器上使用。
在自定义装饰器的选项中,我们可以透传管道参数达到应用管道的目的。