管道
管道是具有 @Injectable() 装饰器的类。管道应实现 PipeTransform 接口。
管道的作用:
转换:管道将输入数据转换为所需的数据输出
验证:对输入数据进行验证,如果验证成功继续传递; 验证失败则抛出异常;
在这个作用下, 管道 参数(arguments) 会由 控制器(controllers)的路由处理程序 进行处理. Nest 会在调用这个方法之前插入一个管道,管道会先拦截方法的调用参数,进行转换或是验证处理,然后用转换好或是验证好的参数调用原方法。
内置管道
Nest 自带六个开箱即用的管道,即
ValidationPipe
ParseIntPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
DefaultValuePipe
每个管道必须提供 transform() 方法。 这个方法有两个参数:
value
metadata
import { PipeTransform, Injecttable, ArgumentMetadata } from '@nestjs/common';
@Injecttable()
export class ValidationPipe implements PipeTransform{
transform(value: any, metadata: ArgumentMetadata ) {
return value;
}
}
value 是当前处理的参数,而 metadata 是其元数据。元数据对象包含一些属性,元数据对象包含一些属性:
type 告诉我们该属性是一个 body @Body(),query @Query(),param @Param() 还是自定义参数
metatype 属性的元类型,例如 String。
data 传递给装饰器的字符串,例如 @Body(‘string’)。 如果您将括号留空,则为 undefined。
export interface ArgumentMetadata {
type: 'body' | 'query' | 'param' | 'custom';
metatype?: Type<unknown>;
data?: string;
}
对象结构验证
例如:我们在做添加的时候,需要验证实体类的属性,我们可以在路由方法中做到这一点,但是这回打破职责单一原则(SPR),另一个就是借助中间件进行处理,但是,我们不可能创建一个整个应用通用的中间件,因为中间件不知道执行的环境,以及被调用的函数和他的参数,这种情况下