国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

實現Nest中參數的聯合類型校驗

開發
在nest的dto層對參數進行校驗時,某個參數可能有多種類型,遇到這種情況你會怎么處理?本文將跟大家分享這個問題的解決方案。

場景概述

我們在進行接口開發時,客戶端需要傳入一個名為text的字段,它可能是string類型或Array<Object>類型(在TS中我們把這種關系稱之為 聯合類型 ),class-validator庫中提供了相關的校驗注解,那把他們寫在一起能否完成相關的校驗呢,如下所示:

export class AppDto {
@ApiProperty({ example: "2022年4月20日修改", description: "備注" })
@IsString()
@IsArray()
@ValidateNested({ each: true })
@Type(() => TextObjDto)
public text!: string | Array<TextObjType>;
}

TextObjDto的代碼如下所示:

export class TextObjDto {
@ApiProperty({ example: "修復了一些bug", description: "內容" })
@IsString()
content!: string;
@ApiProperty({ example: "2022-04-20 07:52", description: "創建時間" })
@IsString()
createTime?: string;
@ApiProperty({ example: true, description: "是否為新功能標識" })
@IsBoolean()
mark?: boolean;
}

啟動項目,用postman測試后發現并不好使,傳了array類型的數據又要求是string類型,傳了string類型的數據又要求是array類型。

注意:嵌套類型的對象驗證需要使用@ValidateNested和@Type注解, @Type接受一個回調函數,函數內部需要返回一個用class聲明的dto類。

解決方案

經過一番求助,翻了一圈class-validator的文檔,發現沒有現成的解決方案。那么,就只能自己拿到參數搞自定義校驗了。

在class-transformer這個庫中,提供了Transform方法,它接受一個回調函數作為參數,回調函數中提供了一個TransformFnParams類型的參數,其中的value字段就是客戶端傳過來的參數,我們只需要對其進行校驗即可。

接下來,我們來看下實現代碼,如下所示:

export class AppDto {
@ApiProperty({ example: "2022年4月20日修改", description: "備注" })
@IsOptional()
@Transform(({ value }) => checkTitleKey(value))
public text!: string | Array<TextObjType>;
}

上述代碼中,我們有一個名為checkTitleKey的校驗函數,因為需要自己校驗,所以就需要自己把TS的類型校驗復刻一遍出來,實現代碼如下所示:

  • 如果校驗通過直接返回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"
);
}
// 對每個key進行校驗
for (let j = 0; j < objKeys.length; j++) {
switch (objKeys[j]) {
case "content":
// content字段必須為string類型
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的聲明也需要進行相對應的修改,如下所示:

  • 全部變為可選參數,參數的必傳與否已經在校驗函數中處理了
  • 類型全部變為any
export type TextObjType = {
content?: any;
createTime?: any;
mark?: any;
};

有一部分開發者可能比較迷惑,不是說ts用any是可恥行為嗎,這我就要糾正下你了,既然它存在自然有使用場景。在我這個場景中,對象里所有key的類型校驗都手動處理了,如果在此處定義了它的類型,在校驗函數中就會報黃色警告,因此針對于需要手動校驗類型的場景而言,使用any是最合適的。

結果校驗

最后,我們針對于代碼里定義的異常規則來驗證下其是否能正常工作,如下所示:

# text字段為string類型
{
"id":"122211",
"title":"新的標題",
"text":"新替換的文本內容",
"name":"新的名字",
"config":"var config = {\"name\":\"aa\",\"age\":\"21\",\"title\":\"標題測試\"}"
}
>>> 接口調用成功

# text字段為Array類型所有key都存在
{
"id":"122211",
"title":"新的標題",
"text":[{"content":"新文本","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:property text objects in the array must contain 'content'

# text字段為number類型
{
"id":"122211",
"title":"新的標題",
"text":19,
"name":"新的名字",
"config":"var config = {\"name\":\"aa\",\"age\":\"21\",\"title\":\"標題測試\"}"
}
>>> 接口報錯400:text must be an array or string

# text字段缺少createTime與mark
{
"id":"122211",
"title":"新的標題",
"text":[{"content":"新文本"}],
"name":"新的名字",
"config":"var config = {\"name\":\"aa\",\"age\":\"21\",\"title\":\"標題測試\"}"
}
>>> 接口調用成功

如下圖所示,我們列舉一個text字段為數字時的報錯截圖,運行結果符合預期,文章開頭的問題成功解決:

責任編輯:趙寧寧 來源: 神奇的程序員
相關推薦

2024-06-19 10:04:15

ifC#代碼

2021-08-12 10:32:50

Spring Boot參數校驗分組校驗

2021-08-10 15:11:27

Spring Boot參數校驗

2025-05-27 07:07:29

2022-03-18 21:51:10

Nest.jsAOP 架構后端

2022-04-11 08:42:09

TypeScript子類型定義

2022-07-27 22:59:53

Node.jsNest

2022-02-17 07:10:39

Nest自定義注解

2025-05-21 08:15:00

GoAPI開發

2022-04-06 10:06:37

判斷算法數值校驗

2025-05-14 00:00:00

2023-03-16 08:23:33

2022-12-30 08:49:41

SpringBoot@Validated

2012-02-21 14:04:15

Java

2021-12-22 06:56:06

MySQCrudjs

2023-11-29 07:23:04

參數springboto

2011-06-11 22:09:06

NET聯合體

2011-07-12 09:18:50

.NET

2022-06-30 07:45:29

搜索聯合搜索索引

2022-02-02 20:21:24

短信驗證碼登錄
點贊
收藏

51CTO技術棧公眾號

新欧美整片sss第一页| av日韩一区| 色婷婷综合久久久久中文字幕1| 日本在线成人| 男人添女荫道口图片| 色www精品视频在线观看| 国产精品无码免费专区午夜| 欧美日韩国产大片| 日韩片欧美片| 日本高清好狼色视频| 久久久久久国产| 国产精品无码永久免费888| 欧美精品高清| 中国黄色录像片| 日韩视频在线一区| 国产精品白丝av| 久久精品黄色| 伊人成色综合网| 久久人人爽人人爽爽久久| 精品亚洲porn| 精品国产第一福利网站| 欧美中日韩在线| www.日本久久久久com.| 2023国产精品| 精品视频免费| 欧美成人精品一区二区男人看| 成人毛片网站| 91精品欧美一区二区三区综合在| 噜噜噜躁狠狠躁狠狠精品视频 | 国产日韩亚洲精品| 日韩三级高清在线| 蜜臀久久99精品久久久久久9| 成人在线爆射| 国产专区中文字幕| 成人动漫在线视频| 精品国产一区二区三区忘忧草 | 国产精品18| 精东影业在线观看| 中文字幕一区二区三区5566| 精品中文字幕视频| 亚洲女女做受ⅹxx高潮| 欧美在线三级| 日韩av免费| 亚洲成人男人天堂| 欧美图片激情小说| 国产99久久久欧美黑人| 日韩欧美国产一二三区| 99re热这里只有精品视频| 激情五月色综合国产精品| 免费高潮视频95在线观看网站| 国产精品天天av精麻传媒| 99国产视频| 久久久人成影片一区二区三区| 欧美三级中文字幕在线观看| 99这里只有久久精品视频| 欧美福利专区| 欧美日韩黄网站| 在线观看麻豆| 一级片免费看| 国产一区二区在线视频播放| av日韩免费电影| 91地址最新发布| 日韩精品在线免费| 亚洲444eee在线观看| 久久久777精品电影网影网 | 亚洲国产91视频| caopon在线免费视频| 作爱视频免费观看视频在线播放激情网| 五月婷婷综合色| 日本高清一区| 精品亚洲欧美日韩| 国产精品手机播放| 国产97在线观看| 奇米一区二区三区四区久久| 久久在线免费观看视频| 亚洲美腿欧美激情另类| 日韩视频免费观看高清完整版 | 麻豆精品一区二区av白丝在线| 国产精品久久久久一区二区三区厕所 | 精品国产综合区久久久久久| 国产精品偷伦一区二区| 日韩免费在线播放| 2021国产精品视频| 国产精品人成电影| 亚洲最大av网站| 国产日韩精品一区二区| 91精品在线观看视频| 国产日韩欧美二区| 日本不卡在线播放| 亚洲一区3d动漫同人无遮挡| 一区二区三区日韩视频| 鲁一鲁一鲁一鲁一澡| 丁香婷婷激情网| 97在线免费| 欧美偷拍视频| 日本色护士高潮视频在线观看| yellow字幕网在线| 黄色精品视频| 久草成人在线| 亚洲视频免费| kk眼镜猥琐国模调教系列一区二区| 国产欧美日产一区| 福利微拍一区二区| 亚洲欧洲在线观看| 欧美一区二区三区免费视| 亚洲一区二区三区视频| 久久爱av电影| 男女激情免费视频| 欧美另类极限扩张| 欧美激情护士| 国产精品伦理久久久久久| 久久精品欧洲| 欧美经典一区二区三区| 在线视频一区二区免费| www.亚洲男人天堂| 91理论片午午论夜理片久久| 性做爰过程免费播放| 免费观影入口看日本视频| av一本在线| 豆花视频一区二区| 香蕉久久夜色精品国产| 亚洲欧美激情插| 亚洲精品久久视频| 国产成人拍精品视频午夜网站 | 色婷婷久久一区二区| 欧美日韩一区二区三区免费| 99热在线免费播放| 动漫一区二区| 日韩黄色大片| 亚洲男人的天堂av| 欧美高清电影在线看| 成人在线观看毛片| 岛国中文字幕在线| 精品国产一区二区三区| 久久久五月婷婷| 91精品国产高清久久久久久| 国产精品久久激情| 日本超碰在线观看| 男人天堂网在线| 在线观看的黄色| 白嫩白嫩国产精品| 欧美三区不卡| caoporn国产精品| 精品日韩美女的视频高清| 日韩中文字幕在线播放| 精品国产乱码一区二区三区四区| 亚洲欧洲日本专区| 欧美日韩一二三四五区| 久久人人爽爽爽人久久久| 免费中文字幕日韩欧美| 国产精品密蕾丝视频下载 | 欧美精品xxx| 亚洲国产成人精品久久| 日韩欧美亚洲成人| 国产精品美女久久久久久久久久久| 七七婷婷婷婷精品国产| 五月天久久久| 欧美一级片网址| 国产白浆在线免费观看| 国产在线电影| 黄色网免费看| 久久精品香蕉视频| 艳母动漫在线观看| 久久综合一区二区三区| 国产精品羞羞答答| 91精品国产电影| 理论片在线不卡免费观看| 亚洲黄色成人网| 欧美日韩免费高清一区色橹橹| 亚洲一区二区在线播放相泽| 国产日韩欧美电影| 97久久久精品综合88久久| 制服丝袜中文字幕在线观看| japansex久久高清精品| 亚洲一区日本| 亚洲精品理论电影| 精品成人在线视频| 国产精品家庭影院| 成人福利视频网站| 精品一区二区三区视频在线观看 | 91网上在线视频| 国产精品免费久久久| 国产国产人免费人成免费视频| av成人app永久免费| 国产乱码精品一区二区三区av| 色欧美88888久久久久久影院| 日韩女优在线播放| 黄色a级片免费| 欧美一级片网址| 91在线观看免费视频| 成人免费在线网址| 国产91在线精品| 18aaaa精品欧美大片h| 制服丝袜在线播放| 麻豆视频网站在线观看| 日本蜜桃在线观看| 日韩伦理在线电影| 国产黄色在线网站| xvideos国产在线视频| www免费在线观看|