场景概述我们在开发接口的时候,客户端需要传入一个名为text的字段,可能是string类型,也可能是Array(在TS中我们把这种关系称为ajointtype),class-validator库提供了相关的验证注解,是否可以将它们写在一起完成相关的验证,如下所示:exportclassAppDto{@ApiProperty({example:"2022年4月20日修改",description:"备注"})@IsString()@IsArray()@ValidateNested({each:true})@Type(()=>TextObjDto)publictext!:string|数组;}TextObjDto的代码如下:@ApiProperty({示例:“2022-04-2007:52”,描述:“创建时间”})@IsString()createTime?:string;@ApiProperty({example:true,description:"是否为新特征标识"})@IsBoolean()mark?:boolean;}启动项目。用postman测试后,发现不太好用。数组类型的数据要求是字符串类型,字符串类型的数据要求是数组类型。注意:嵌套类型的对象验证需要使用@ValidateNested和@Type注解。@Type接受一个回调函数,该函数需要返回一个用class声明的dto类。解决方案求助后,搜索了class-validator的文档,发现没有现成的解决方案。那么,就只能自己去获取参数来做自定义验证了。在类转换器库中,提供了Transform方法,它接受一个回调函数作为参数。回调函数提供了一个TransformFnParams类型的参数,value字段为客户端传入的参数。我们只需要修改它。只是检查一下。接下来我们看一下实现代码,如下图:)=>checkTitleKey(value))publictext!:string|Array;}在上面的代码中,我们有一个校验函数,名字叫checkTitleKey,因为需要自己校验,所以需要把TS的类型校验复现出来,实现代码如下:如果验证通过,直接返回值参数。如果验证失败,直接使用nest内置异常抛出。exportfunctioncheckTitleKey(value:string|number|Array|undefined|null):any{if(typeofvalue==="string"){//没有变化,直接返回值;}elseif(valueinstanceofArray){//不能为空数组if(value.length<=0){thrownewBadRequestException("propertytextcannotbeanemptyarray","BadRequest");}for(leti=0;i>>API调用成功#textfield是Array类型,所有key都存在{"id":"122211","title":"newtitle","text":[{"content":"newtext","createTime":"2022-04-20","mark":false}],"name":"newname","config":"varconfig={\"name\":\"aa\",\"age\":\"21\",\"title\":\"titletest\"}"}>>>接口调用成功#文本字段缺少内容{"id":"122211","title":"新标题","text":[{"createTime":"2022-04-20","mark":false}],"name":"Newname","config":"varconfig={\"name\":\"aa\",\"age\":\"21\",\"title\":\"titletest\"}"}>>>接口错误400:数组中的属性文本对象必须包含'content'#textfieldisoftypenumber{"id":"122211","title":"新标题","text":19,"name":"新名称","config":"varconfig={\"name\":\"aa\",\"age\":\"21\",\"title\":\"Titletest\"}"}>>>界面错误400:textmustbearrayorstring#text字段缺少createTime和mark{"id":"122211","title":"NewTitle","text":[{"content":"NewText"}],"name":"新名字","config":"varconfig={\"name\":\"aa\",\"age\":\"21\",\"title\":\"标题测试\"}"}>>>接口调用成功如下图。当文本字段为数字时,我们列出了错误报告的屏幕截图。运行结果符合预期。文章开头的问题成功解决:
在Nest中实现参数的联合类型校验相关文章