上一篇介绍了如何使用中间件、拦截器、过滤器打造日志系统,接下来将介绍后端永远绕不过去的痛:参数验证。
你是否曾经为了验证参数,写了一大堆 if - else ?然后还要判断各种参数类型?相似的结构在不同的方法里判断,却又要复制一遍代码?
使用 DTO 可以清晰的了解对象的结构,使用 Pipes(管道)配合 还可以对参数类型进行判断,还可以在验证失败的时候抛出错误信息。
前两天发现 NestJS 更新到了 7.0.3(之前是 6.0.0),为了让教程更贴合实际,故果断升级。升级后没发现什么大问题,之前的代码照常运行,若各位读者发现什么其他 Bug ,可以在 GitHub 上 issues。
GitHub 项目地址,欢迎各位大佬 Star。

其实就是输出了一个类似于声明接口的 class,表明了参数名和类型,并且是只读的。
当然,Nest 支持使用 Interface(接口) 来定义 DTO,具体语法可以浏览 TypeScript 官方文档,不过 Nest 建议使用 Class 来做 DTO(就踩坑经验而言, Class 确实比 Interface 方便多了),所以 Interface 在这里就不多介绍了。
定义好 DTO 后,接下来将演示怎么和管道配合来验证参数。

管道和拦截器有点像,都是在数据传输过程中的 “关卡”,只不过各司其职。
管道有两个类型:

  • 转换:管道将输入数据转换为所需的数据输出;
  • 验证:对输入数据进行验证,如果验证成功继续传递,验证失败则抛出异常;

ValidationPipe 是 Nest.js 自带的三个开箱即用的管道之一(另外两个是 ParseIntPipeParseUUIDPipe,现在还用不到)。

每个管道必须提供 transform() 方法。 这个方法有两个参数:

  • metadata

value 是当前处理的参数,而 metadata 是其元数据。

简单介绍完一些概念后,开始实战,先创建 pipe 文件:

这里我们还需要安装两个依赖包:

  1. $ yarn add class-validator class-transformer -S

然后在 validation.pipe.ts 中编写验证逻辑:

光有这些还不行,我们应该增加错误提示:

上面简单编写了一些常用的验证手段,class-validator 里面有非常多的验证方法,有兴趣的读者可以访问官方文档去学习:GitHub: class-validator
接下来我们测试一下,先测试为空的情况:

上图可以看到 accountName@IsNotEmpty() 已经生效了

本篇介绍了如何定义 DTO,如何使用 Pipes 管道,以及如何配合 class-validator 进行入参验证。
定义 DTO 有人可能会觉得好麻烦,直接 any 一把梭不就好了,然后 TypeScript 就逐渐变成了 AnyScript 了。。。。

但如果不拥抱 TypeScript 的特性,那还不如直接用 JavaScript 来写,这样还更快(如 Koa、Egg 等),定义 DTO 还有一个好处,那就是可以配合 Swagger 自动生成文档,并且是可请求的,极大方便了前端阅读文档,以后的教程会说明如何操作。
下一篇,将介绍一下如何使用拦截器进行权限认证。

扫一扫关注上方公众号,拉学习群和答疑解惑