一些问题
nest集成了ts,我们可以通过ts做数据类型校验,为什么还要用dto?
答:因为ts的类型校验只是在编写代码的时候给开发者看的,再搭配相应的编辑器插件,来进行约束或者类型提示,实际是不会转译到js里;但dto是通过class来约束,js有class这个数据类型,这个是会被转译到js里去的。所以推荐用dot而非ts的interface来声明数据类型
一个朴素的dto
声明
使用,表示将收到一个UserReqDto类型的body,且将返回一个UserResDto类型的响应数据
可见我们在class里还是使用的ts来描述成员类型,之前就说过ts是不会转译到js里的,所以用这种朴素的dto校验只能校验数据中是否包含和class中的成员同名的属性(若收到{ id: 123, pwd: 456 },明明收到的是number类型也不会告知类型错误,它只能保证有id和pwd两个属性)。所以我们还需要一种更好的校验方式,如后:
class-validator
安装
$ npm i --save class-validator class-transformer
使用
第一步:在main.ts中注册ValidationPipe
校验管道
第2步:在.dto.ts中使用class-validator
中的装饰器来校验类型,装饰器名字还是比较易懂,故不赘述
这样如果传入的·类型不对,也能被检验出来并报错,似如下参数,pwd应该是string但传了个number,便报错如右:(错在哪一目了然)
结语
如上便是参数类型校验的一些基操,还有更多细腻操作以后再记录,如有谬误之处还请斧正。