本文转载自微信公众号《魔法程序员》,作者:魔法程序员。转载本文请联系神奇程序员公众号。PrefaceNest与class-validator[1]配合得很好,它允许我们使用基于装饰器的验证。在dto层,我们可以通过它内置的一些注解来完成一些常用的参数校验。然而,在我们编写业务代码的时候,内置的注解往往不能满足我们。这时候为了代码的一致性,我们需要根据需求自定义一个注解。本文将带大家一起实现一个注解。欢迎各位有兴趣的开发者阅读本文。场景概述客户端传入不符合规范的json字符串。我们需要对其进行拦截,并将其转化为json对象,用于下一步的验证。客户端传入的字符串如下:varconfig='{"name":"aa","age":"21","title":"titletest"}'处理时需要截取varconfig=,只保留json字符串,然后转成json对象,属性总数必须大于2,我们可以轻松写出代码,如下所示://验证配置字符串是否符合规范导出函数verifyConfig(draftConfig?:string):boolean|Record{//删除冗余字符if(draftConfig&&draftConfig.length>=12){draftConfig=draftConfig.substring(12,draftConfig.length);}让draftData={};try{if(typeofdraftConfig==="string"){draftData=JSON.parse(draftConfig);}//draftjson字段不足if(Object.keys(draftData).length<2){returnfalse;}}catch(e){//草稿配置数据格式错误returnfalse;}returndraftData;}实现思路本文继续沿用《使用NestJS构建服务端应用[2]》一文中创建的项目,并在此基础上进行扩展。看完class-validator仓库文档的custom-validation-decorators[3]一章,我们对其流程有了一个大致的了解,接下来我们来实践一下。注册装饰器首先我们在项目根目录下创建一个decorators文件夹,所有的注解实现文件都会放在这个目录下。然后我们在其目录中创建ConfigDecor.ts文件。我们通过registerDecorator方法注册一个装饰器,代码如下:IsConfig是注解的名字,是一个函数类型,接受一个ValidationOptions类型的可选参数。装饰器注册函数中有一个validator属性,用于验证数据。下一章会详细解释//配置校验注解exportfunctionIsConfig(validationOptions?:ValidationOptions){returnfunction(object:Record,propertyName:string):void{//注册一个装饰器registerDecorator({name:"IsConfig",target:object.constructor,options:validationOptions,propertyName:propertyName,validator:IsConfigConstraint});};}数据验证类装饰器的validator属性值是用@ValidatorConstraint装饰的类,该类必须实现ValidatorConstraintInterface接口。代码如下:validate接受的参数是dto中注解的字段对应的值,我们需要的是对其进行校验,校验函数是使用我们在文章开头写的verifyConfig方法。defaultMessage是验证失败时默认返回给客户端的错误信息boolean{//验证草稿配置//如果验证程序的返回值为boolean,则数据格式错误将被替换returntypeofverifyConfig(value)!=="boolean";}//验证失败时的默认错误信息defaultMessage(args:ValidationArguments):string{return`property${args.property}dataformaterror`;}}使用装饰器最后,我们只需要像内置装饰器一样使用它,代码如下:exportclassAppDto{@MinLength(5)@IsString()publicid!:string;@IsString()公共标题!:字符串;@IsString()公共名称!:字符串;@IsConfig()publicconfig!:string;}最后我们启动项目,使用postman进行测试,如下图:我们传递了一个不符合规范的字符串,装饰器验证失败,返回了我们定义的默认验证信息。image-20220217012646287下面测试一下数据是否正确,如下图,调用成功:小提示:我们在注册装饰器的时候,提供了一个可选参数,它的作用就像内置注解一样,修改它的publicmessage等属性,我们可以自定义验证失败时的错误信息。示例代码本文列出的完整代码请移步:JsonDataVerifyUtilas.ts[4]ConfigDecor.ts[5]AppDto[6]写在最后,分享给大家。我是魔法程序员,前端开发工程师。如果你对我感兴趣,请到我的个人网站[7]了解更多。公众号无法外链,如文章中有链接,可点击下方阅读原文查看