管道
管道是具有
@Injectable()
装饰器的类。管道应实现
PipeTransform
接口。
管道的作用:
转换:管道将输入数据转换为所需的数据输出
验证:对输入数据进行验证,如果验证成功继续传递
;
验证失败则抛出异常
;
在这个作用下
,
管道 参数
(arguments)
会由 控制器
(controllers)
的路由处理程序 进行处理
. Nest
会在调用这个方法之前插入一
个管道,管道会先拦截方法的调用参数
,
进行转换或是验证处理,然后用转换好或是验证好的参数调用原方法。
内置管道
Nest
自带六个开箱即用的管道,即
ValidationPipe
ParseIntPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
DefaultValuePipe
每个管道必须提供
transform()
方法。 这个方法有两个参数:
value
metadata
value
是当前处理的参数,而
metadata
是其元数据。元数据对象包含一些属性,元数据对象包含一些属性:
type
告诉我们该属性是一个
body @Body()
,
query @Query()
,
param @Param()
还是自定义参数
metatype
属性的元类型,例如
String
。
data
传递给装饰器的字符串,例如
@Body('string')
。 如果您将括号留空,则为
undefined
。
对象结构验证
例如:我们在做添加的时候,需要验证实体类的属性,我们可以在路由方法中做到这一点,但是这回打破职责
单一原则(
SPR
),另一个就是借助中间件进行处理,但是,我们不可能创建一个整个应用通用的中间件,因为
中间件不知道执行的环境,以及被调用的函数和他的参数,这种情况下就可以考虑管道
Joi
库是允许您使用一个可读的
API
以非常简单的方式创建
schema
(实体类)
安装依赖:
npm install --save @hapi/joi
$ npm install --save-dev @types/hapi__joi
对象结构验证
我们需要在管道类中的构造函数中注入实体类,但前提是你以及创建好实体类
验证管道 要么返回该值,要么抛出一个错误
绑定管道
绑定管道(可以绑在
controller
或是其方法上)非常简单。我们使用
@UsePipes()
装饰器并创建一个管道实例,
并将其传递给
Joi
验证。
类验证器(JavaScript不可用)
Nest
与
class-validator
的兼容性很好,允许基于
装饰器的验证,安装依赖:
npm i --save class-validator class-transformer
在实体类中添加装饰器即可
https://github.com/typestack/class-validator#usage
查看更多类验证器修饰符的更多信息。
创建管道类
绑定管道类
管道,与异常过滤器相同,它们可以是方法范围的、控制器范围的和全局范围的。另外,管道可以是参数范围的。
我们可以直接将管道实例绑定到路由参数装饰器,例如
@Body()
。
当验证逻辑仅涉及一个指定的参数时,参数范围的管道非常有用。要在方法级别设置管道,您需要使用
UsePipes()
装
饰器。
当然最高效的方式直接传入类(依赖注入)
全局作用域管道
由于
ValidationPipe
被创建为尽可能通用,所以我们将把它设置为一个全局作用域的管道,用于整个应用程序中的每
个路由处理器。
全局管道用于整个应用程序、每个控制器和每个路由处理程序。就依赖注入而言,从任何模块外部注册的全局管道
(如上例所示)无法注入依赖,因为它们不属于任何模块。为了解决这个问题,可以使用以下构造直接为任何模块
设置管道:
转换管道
验证不是管道唯一的用处。管道也可以将输入数据转换为所需的数据,因为从
transform
函数返回的值完全覆盖了参
数先前的值,有什么作用呢?
字符串转化为整数
密码加密
...
转换管道
被插入在客户端请求和请求处理程序之间用来处理客户端请求。
如下所示
,
我们可以很简单的配置管道来处理所参数
id: