用户登录

自由学三年,把想法变成现实。33 折优惠(最后 6 天), 现在订阅 →

在终端,生成一个自定义的管道,nest generate 生成一个 pipe,名字是 demo,放在 core/pipes 目录的下面,回到项目,找到刚才创建的这个自定义的管道。

管道是一个类,它要用 @Injectable 装饰一下,这个类还得实施 PipeTransform 接口,所以需要在类里添加一个 transform 方法。

在这个方法里你可以验证或者转换数据,方法接收一个 value 参数,它就是要验证的数据,还有一个 metadata 参数,它是一个 ArgumentMetadata。

里面有几个属性,比如有 type,表示参数的类型,它的值一般就是 body,query,param 或者 custom。

ArgumentMetadata 里面还有 metatype,它是数据的类型,比如 String,Array 这些东西。

还有一个 data 属性,它是给装饰器传递的值,可以在这个管道里输出这两个参数的值,输出一个 value, 下面再输出 metadata。

回到 posts.controller,找到控制器的 store 方法,我们可以直接把管道用在参数上,给 @User 装饰器提供一个管道, 名字是 DemoPipe。

在客户端,用 POST 请求一下 posts 地址,回到控制台检查一下。

这里在 DemoPipe 管道输出的 value 就是请求里的 user , metadata 里的 metatype 是 Object,type 是 custom,data 是 demo ,这个 data 的值就是给 @User 装饰器提供的参数值。

我们可以把这个 DemoPipe 用在 @Body 里面。

在客户端,发送一下请求,再到控制台上观察一下,这回输出的 value 会是请求里的主体数据。

metadata 里面 metatype 是 CreatePostDto,type 是 body ,表示请求主体。

data 的值是 undefined,因为在使用 @Body 装饰器的时候没有提供参数值,所以这里输出的 metadata 里的 data 就会是 undefined。

下面再把这个 DemoPipe ,放在 show 方法的 id 参数上用一下,逗号分隔一下,用一个 DemoPipe。

再到客户端配置一个请求,用 GET 方法,请求 posts/3。

回到控制台检查一下输出的东西,这回 value 的值是 3 , metadata 里面 metatype 是 Object ,type 是 param 表示请求参数,data 的值是 id ,这个 id 就是在使用 @Param 装饰器的时候提供的 data 参数的值。

理解自定义管道(Pipe)《 Nest.js 应用框架:核心部件(3) 》

统计

10670
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点