当前位置: 首页 > 后端技术 > Node.js

实现Nest中参数的联合类型校验

时间:2023-04-04 01:20:33 Node.js

鍓嶈█鍦╪est鐨刣to灞傚鍙傛暟杩涜鏍¢獙鏃讹紝鏌愪釜鍙傛暟鍙兘鏈夊绉嶇被鍨嬶紝閬囧埌杩欑鎯呭喌浣犱細鎬庝箞澶勭悊锛熸湰鏂囧皢璺熷ぇ瀹跺垎浜繖涓棶棰樼殑瑙e喅鏂规锛屾杩庡悇浣嶆劅鍏磋叮鐨勫紑鍙戣€呴槄璇绘湰鏂囥€傚満鏅杩版垜浠湪杩涜鎺ュ彛寮€鍙戞椂锛屽鎴风闇€瑕佷紶鍏ヤ竴涓悕涓簍ext鐨勫瓧娈碉紝瀹冨彲鑳芥槸string绫诲瀷鎴朅rray<Object>绫诲瀷锛堝湪TS涓垜浠妸杩欑鍏崇郴绉颁箣涓?鑱斿悎绫诲瀷 锛夛紝class-validator搴撲腑鎻愪緵浜嗙浉鍏崇殑鏍¢獙娉ㄨВ锛岄偅鎶婁粬浠啓鍦ㄤ竴璧疯兘鍚﹀畬鎴愮浉鍏崇殑鏍¢獙鍛紝濡備笅鎵€绀猴細export class AppDto { @ApiProperty({ example: "2022骞?鏈?0鏃ヤ慨鏀?quot;, description: "澶囨敞" }) @IsString() @IsArray() @ValidateNested({ each: true }) @Type(() => TextObjDto) public text!: string | Array<TextObjType>; }TextObjDto鐨勪唬鐮佸涓嬫墍绀猴細export class TextObjDto { @ApiProperty({ example: "淇浜嗕竴浜沚ug", description: "鍐呭" }) @IsString() content!: string; @ApiProperty({ example: "2022-04-20 07:52", description: "鍒涘缓鏃堕棿" }) @IsString() createTime?: string; @ApiProperty({ example: true, description: "鏄惁涓烘柊鍔熻兘鏍囪瘑" }) @IsBoolean() mark?: boolean;}鍚姩椤圭洰锛岀敤postman娴嬭瘯鍚庡彂鐜板苟涓嶅ソ浣匡紝浼犱簡array绫诲瀷鐨勬暟鎹張瑕佹眰鏄痵tring绫诲瀷锛屼紶浜唖tring绫诲瀷鐨勬暟鎹張瑕佹眰鏄痑rray绫诲瀷銆傛敞鎰忥細宓屽绫诲瀷鐨勫璞¢獙璇侀渶瑕佷娇鐢ˊValidateNested鍜孈Type娉ㄨВ锛?@Type鎺ュ彈涓€涓洖璋冨嚱鏁帮紝鍑芥暟鍐呴儴闇€瑕佽繑鍥炰竴涓敤class澹版槑鐨刣to绫汇€傝В鍐虫柟妗堢粡杩囦竴鐣眰鍔╋紝缈讳簡涓€鍦坈lass-validator鐨勬枃妗o紝鍙戠幇娌℃湁鐜版垚鐨勮В鍐虫柟妗堛€傞偅涔堬紝灏卞彧鑳借嚜宸辨嬁鍒板弬鏁版悶鑷畾涔夋牎楠屼簡銆傚湪class-transformer杩欎釜搴撲腑锛屾彁渚涗簡Transform鏂规硶锛屽畠鎺ュ彈涓€涓洖璋冨嚱鏁颁綔涓哄弬鏁帮紝鍥炶皟鍑芥暟涓彁渚涗簡涓€涓猅ransformFnParams绫诲瀷鐨勫弬鏁帮紝鍏朵腑鐨剉alue瀛楁灏辨槸瀹㈡埛绔紶杩囨潵鐨勫弬鏁帮紝鎴戜滑鍙渶瑕佸鍏惰繘琛屾牎楠屽嵆鍙€傛帴涓嬫潵锛屾垜浠潵鐪嬩笅瀹炵幇浠g爜锛屽涓嬫墍绀猴細export class AppDto { @ApiProperty({ example: "2022骞?鏈?0鏃ヤ慨鏀?quot;, description: "澶囨敞" }) @IsOptional() @Transform(({ value }) => checkTitleKey(value)) public text!: string | Array<TextObjType>;}涓婅堪浠g爜涓紝鎴戜滑鏈変竴涓悕涓篶heckTitleKey鐨勬牎楠屽嚱鏁帮紝鍥犱负闇€瑕佽嚜宸辨牎楠岋紝鎵€浠ュ氨闇€瑕佽嚜宸辨妸TS鐨勭被鍨嬫牎楠屽鍒讳竴閬嶅嚭鏉ワ紝瀹炵幇浠g爜濡備笅鎵€绀猴細濡傛灉鏍¢獙閫氳繃鐩存帴杩斿洖value鍙傛暟鍗冲彲濡傛灉鏍¢獙涓嶉€氳繃鐩存帴浣跨敤nest鍐呯疆寮傚父杩涜鎶涘嚭鍗冲彲export function checkTitleKey( value: string | number | Array<TextObjType> | undefined | null): any { if (typeof value === "string") { // 涓嶅仛鏇存敼锛岀洿鎺ヨ繑鍥? return value; } else if (value instanceof Array) { // 涓嶈兘涓虹┖鏁扮粍 if (value.length <= 0) { throw new BadRequestException( "property text cannot be an empty array", "Bad Request" ); } for (let i = 0; i < value.length; i++) { // 鏍¢獙鏁扮粍涓殑瀵硅薄瀛楁 const objKeys = Object.keys(value[i]); if (objKeys.length <= 0) { throw new BadRequestException( "property text contains empty objects", "Bad Request" ); } // 蹇呴』鍖呭惈content瀛楁 if (!objKeys.includes("content")) { throw new BadRequestException( "property text objects in the array must contain 'content'", "Bad Request" ); } // 瀵规瘡涓猭ey杩涜鏍¢獙 for (let j = 0; j < objKeys.length; j++) { switch (objKeys[j]) { case "content": // content瀛楁蹇呴』涓簊tring绫诲瀷 if (typeof value[i].content !== "string") { throw new BadRequestException( "property text 'content' of the objects in the array must be of type string", "Bad Request" ); } break; case "duration": if (typeof value[i].createTime !== "string") { throw new BadRequestException( "property text 'createTime' of the objects in the array must be of type number", "Bad Request" ); } break; case "delay": if (typeof value[i].mark !== "boolean") { throw new BadRequestException( "property text 'mark' of the objects in the array must be of type number", "Bad Request" ); } break; default: break; } } } return value; } else { throw new BadRequestException( "text must be an array or string", "Bad Request" ); }}TextObjType鐨勫0鏄庝篃闇€瑕佽繘琛岀浉瀵瑰簲鐨勪慨鏀癸紝濡備笅鎵€绀猴細鍏ㄩ儴鍙樹负鍙€夊弬鏁帮紝鍙傛暟鐨勫繀浼犱笌鍚﹀凡缁忓湪鏍¢獙鍑芥暟涓鐞嗕簡绫诲瀷鍏ㄩ儴鍙樹负anyexport type TextObjType = { content?: any; createTime?: any; mark?: any;};鏈変竴閮ㄥ垎寮€鍙戣€呭彲鑳芥瘮杈冭糠鎯戯紝涓嶆槸璇磘s鐢╝ny鏄彲鑰昏涓哄悧锛岃繖鎴戝氨瑕佺籂姝d笅浣犱簡锛屾棦鐒跺畠瀛樺湪鑷劧鏈変娇鐢ㄥ満鏅€傚湪鎴戣繖涓満鏅腑锛屽璞¢噷鎵€鏈塳ey鐨勭被鍨嬫牎楠岄兘鎵嬪姩澶勭悊浜嗭紝濡傛灉鍦ㄦ澶勫畾涔変簡瀹冪殑绫诲瀷锛屽湪鏍¢獙鍑芥暟涓氨浼氭姤榛勮壊璀﹀憡锛屽洜姝ら拡瀵逛簬闇€瑕佹墜鍔ㄦ牎楠岀被鍨嬬殑鍦烘櫙鑰岃█锛屼娇鐢╝ny鏄渶鍚堥€傜殑銆傜粨鏋滄牎楠屾渶鍚庯紝鎴戜滑閽堝浜庝唬鐮侀噷瀹氫箟鐨勫紓甯歌鍒欐潵楠岃瘉涓嬪叾鏄惁鑳芥甯稿伐浣滐紝濡備笅鎵€绀猴細# text瀛楁涓簊tring绫诲瀷{ "id":"122211", "title":"鏂扮殑鏍囬", "text":"鏂版浛鎹㈢殑鏂囨湰鍐呭", "name":"鏂扮殑鍚嶅瓧", "config":"var config = {\"name\":\"aa\",\"age\":\"21\",\"title\":\"鏍囬娴嬭瘯\"}"}>>> 鎺ュ彛璋冪敤鎴愬姛# text瀛楁涓篈rray绫诲瀷鎵€鏈塳ey閮藉瓨鍦▄ "id":"122211", "title":"鏂扮殑鏍囬", "text":[{"content":"鏂版枃鏈?quot;,"createTime":"2022-04-20","mark":false}], "name":"鏂扮殑鍚嶅瓧", "config":"var config = {\"name\":\"aa\",\"age\":\"21\",\"title\":\"鏍囬娴嬭瘯\"}"}>>> 鎺ュ彛璋冪敤鎴愬姛# text瀛楁缂哄皯content{ "id":"122211", "title":"鏂扮殑鏍囬", "text":[{"createTime":"2022-04-20","mark":false}], "name":"鏂扮殑鍚嶅瓧", "config":"var config = {\"name\":\"aa\",\"age\":\"21\",\"title\":\"鏍囬娴嬭瘯\"}"}>>> 鎺ュ彛鎶ラ敊400锛歱roperty text objects in the array must contain 'content'# text瀛楁涓簄umber绫诲瀷{ "id":"122211", "title":"鏂扮殑鏍囬", "text":19, "name":"鏂扮殑鍚嶅瓧", "config":"var config = {\"name\":\"aa\",\"age\":\"21\",\"title\":\"鏍囬娴嬭瘯\"}"}>>> 鎺ュ彛鎶ラ敊400锛歵ext must be an array or string# text瀛楁缂哄皯createTime涓巑ark{ "id":"122211", "title":"鏂扮殑鏍囬", "text":[{"content":"鏂版枃鏈?quot;}], "name":"鏂扮殑鍚嶅瓧", "config":"var config = {\"name\":\"aa\",\"age\":\"21\",\"title\":\"鏍囬娴嬭瘯\"}"}>>> 鎺ュ彛璋冪敤鎴愬姛濡備笅鍥炬墍绀猴紝鎴戜滑鍒椾妇涓€涓猼ext瀛楁涓烘暟瀛楁椂鐨勬姤閿欐埅鍥撅紝杩愯缁撴灉绗﹀悎棰勬湡锛屾枃绔犲紑澶寸殑闂鎴愬姛瑙e喅馃绀轰緥浠g爜鏂囦腑鎵€涓句唬鐮佺殑瀹屾暣鐗堣绉绘锛欰ppDto.ts-@TransformJsonDataVerifyUtilas.ts-checkTitleKeyTextObjType.ts鍐欏湪鏈€鍚庤嚦姝わ紝鏂囩珷灏卞垎浜畬姣曚簡銆傛垜鏄濂囩殑绋嬪簭鍛橈紝涓€浣嶅墠绔紑鍙戝伐绋嬪笀銆傚鏋滀綘瀵规垜鎰熷叴瓒o紝璇风Щ姝ユ垜鐨勪釜浜虹綉绔欙紝杩涗竴姝ヤ簡瑙c€傛枃涓鏈夐敊璇紝娆㈣繋鍦ㄨ瘎璁哄尯鎸囨锛屽鏋滆繖绡囨枃绔犲府鍒颁簡浣狅紝娆㈣繋鐐硅禐鍜屽叧娉煒?/p>