精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實現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-10 15:11:27

Spring Boot參數校驗

2021-08-12 10:32:50

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

2022-12-30 08:49:41

SpringBoot@Validated

2023-03-16 08:23:33

2012-02-21 14:04:15

Java

2021-12-22 06:56:06

MySQCrudjs

2022-06-30 07:45:29

搜索聯合搜索索引

2023-11-29 07:23:04

參數springboto

2011-06-11 22:09:06

NET聯合體

2011-07-12 09:18:50

.NET

2022-02-02 20:21:24

短信驗證碼登錄
點贊
收藏

51CTO技術棧公眾號

亚洲二区自拍| 欧美一级黑人aaaaaaa做受| 久久久国产欧美| 黄色国产网站在线播放| 国产精品一区二区免费不卡| 久久伊人色综合| 无码精品一区二区三区在线播放| 国产成人免费9x9x人网站视频| 亚洲视频免费看| 久久国产精品99久久久久久丝袜| 亚洲天堂一二三| 99成人免费视频| www.国产精品一二区| av在线播放网址| 日本久久久久| 色综合视频在线观看| 亚洲一区 在线播放| 裸体xxxx视频在线| 国产成人精品影院| 国产欧美一区二区三区在线看| 日本少妇激情舌吻| 亚洲天天综合| 在线观看中文字幕亚洲| japanese在线观看| 99视频有精品高清视频| 91久久线看在观草草青青| 国产精品久久国产| 黄色网在线播放| 国产日产欧美一区| 极品日韩久久| www黄色网址| 精品一区二区在线视频| 国产福利精品av综合导导航| 国产精品第一页在线观看| 99精品视频精品精品视频| 精品无码久久久久久国产| 日本wwwxx| avtt久久| 欧美一区二区在线不卡| 黄大色黄女片18第一次| 快播电影网址老女人久久| 午夜精品久久久久影视| 精品人妻大屁股白浆无码| 麻豆视频免费在线观看| 中文字幕第一页久久| 鲁丝片一区二区三区| 欧美一级片免费| 国产a精品视频| www.成人av.com| 国产黄色一区二区| 国产精品自拍av| 91在线观看免费网站| 一级爱爱免费视频| 久久成人精品无人区| 国产精品视频网| 伊人网视频在线| 麻豆极品一区二区三区| 国产欧美va欧美va香蕉在线| 中文字幕在线网站| 久久激五月天综合精品| 成人黄色短视频在线观看| 中文字幕在线观看国产| 九九精品视频在线看| 成人信息集中地欧美| 97精品人妻一区二区三区香蕉| 美美哒免费高清在线观看视频一区二区 | 欧美在线免费视频| 亚洲午夜18毛片在线看| 天堂蜜桃91精品| 国产欧美日韩91| 国产精品高潮呻吟久久久| 国产精品一区免费在线观看| 3d精品h动漫啪啪一区二区| 亚洲国产精彩视频| av电影在线观看一区| 免费成人深夜夜行视频| 二区三区在线| 亚洲人123区| 青青青在线视频播放| 美女露胸视频在线观看| 日本高清视频一区二区| jizz欧美性11| 久草在线综合| 一区二区三区视频免费| 永久看片925tv| 亚洲男女自偷自拍| 国产精品日韩在线播放| www.超碰在线.com| 久久亚洲春色中文字幕久久久| 欧美一区1区三区3区公司 | 日韩欧美有码在线| 在线看的黄色网址| 波多野结衣欧美| 亚洲色图综合网| 久久久久亚洲AV成人| 国产精品综合| 91精品在线影院| 午夜福利理论片在线观看| 国产精品久久午夜夜伦鲁鲁| www成人免费| 久久亚洲资源中文字| 精品久久久久香蕉网| 我不卡一区二区| 欧美日韩亚洲一区二区三区在线| 国产成人黄色av| 精品久久无码中文字幕| 国产日韩综合av| 久青草视频在线播放| 成人国产网站| 日韩二区三区在线| 欧美国产精品一二三| 青青草国产精品亚洲专区无| 国产精品日韩一区二区免费视频| 在线观看麻豆| 色欲综合视频天天天| 免费观看黄网站| 激情婷婷综合| 91精品国产99久久久久久| 在线视频播放大全| 久久免费视频色| av高清在线免费观看| 日韩一区中文| 国产亚洲精品久久久优势| 国产无码精品在线观看| 黄网站免费久久| 亚洲乱码一区二区三区| 欧美xxx性| 亚洲国产精品99| 久久精品一级片| 麻豆成人综合网| 亚洲精品成人a8198a| 在线手机中文字幕| 亚洲精品videossex少妇| 青娱乐国产在线| 国产一区二区日韩精品| 一区二区不卡视频| 成人黄色毛片| 一区二区三区四区在线观看视频| 五月天婷婷久久| www.亚洲激情.com| 日韩视频免费播放| 伊人www22综合色| 九九热这里只有精品6| 国产精品亚洲lv粉色| 国产精品国产三级国产aⅴ原创| 美女网站视频黄色| 精品国产精品久久一区免费式| 久久99亚洲精品| 亚洲精品视频网| 亚洲永久精品大片| 亚洲视频天天射| 亚洲国产日本| 精品欧美一区二区在线观看视频| 黑人精品视频| 亚洲精品黄网在线观看| 日韩 欧美 综合| 久久亚洲精精品中文字幕早川悠里| 91免费视频网站在线观看| 青青草原在线亚洲| 日韩免费在线播放| 成年人视频网站在线| 欧美三区在线观看| 日日噜噜夜夜狠狠久久波多野| 国产精品91一区二区| 国产夫妻自拍一区| 亚洲欧美校园春色| 国产精品入口免费视| 麻豆影院在线| 日韩情涩欧美日韩视频| 日韩xxxxxxxxx| 久久久99久久| www.com污| 国产精品扒开腿做爽爽爽软件| 国产尤物99| 日韩色淫视频| 欧美精品在线第一页| 人妻va精品va欧美va| 欧美性猛交丰臀xxxxx网站| 婷婷综合在线视频| 国产精品系列在线观看| 日韩欧美一区二| 成人三级视频| 国产精品视频免费一区二区三区| 美女在线视频免费| 日韩在线视频免费观看| 成人av免费播放| 色94色欧美sute亚洲线路一ni| 秋霞欧美一区二区三区视频免费 | 欧美日韩亚州综合| 五月婷婷一区二区| 久久伊人蜜桃av一区二区| 亚洲欧美自偷自拍另类| 亚洲理论在线| 一区二区三区不卡在线| 国产精品欧美大片| 国产欧美日韩中文| 黄毛片在线观看| 久久视频免费观看| 日本电影一区二区在线观看| 91精品国产欧美日韩| 久久久久99精品成人片我成大片| 国产精品福利电影一区二区三区四区| 蜜臀aⅴ国产精品久久久国产老师| 丝袜美腿亚洲综合| 中国丰满熟妇xxxx性| 日韩欧美大片| 国产三区精品| 精品欧美视频| 国产噜噜噜噜噜久久久久久久久| 91色在线看| 久久亚洲精品网站| 草草影院在线观看| 亚洲国产天堂久久综合| 国产视频一区二区三| 在线免费观看日本欧美| jizz国产免费| 一卡二卡三卡日韩欧美| av资源在线免费观看| 久久蜜臀精品av| 中文字幕在线视频播放| 国产精品99久久久久久久女警| 三年中国国语在线播放免费| 国产亚洲网站| 日韩国产成人无码av毛片| 国产精品97| 台湾成人av| 国产精品一区二区av日韩在线 | 亚洲一区二区三区四区精品| 日日夜夜免费精品视频| 国产成人无码精品久久久性色| 国产精品成人一区二区网站软件| 色播五月综合| 黑人操亚洲人| 欧美日韩在线精品| 一区三区在线欧| 久久亚洲高清| 亚洲成aⅴ人片久久青草影院| 国产麻豆乱码精品一区二区三区| 日韩在线成人| 亚洲最大福利视频| 国产精品一站二站| 91亚洲国产成人精品性色| 色综合.com| 亚洲xxxx18| 日本少妇精品亚洲第一区| 成人乱色短篇合集| 国产精品白丝久久av网站| 国产在线精品成人一区二区三区| 成人在线高清| 成人a免费视频| 国产一区二区三区免费在线| 91人成网站www| 欧美黄色一级| 国产精品一区二区三区在线 | 国产又爽又黄ai换脸| 91欧美在线| 99视频精品全部免费看| 欧美三区在线| 欧美精品久久久久久久免费| 国产一区二区三区成人欧美日韩在线观看| 国产午夜福利在线播放| 午夜影院日韩| av污在线观看| 国产中文一区二区三区| 苍井空张开腿实干12次| 99久久国产综合精品麻豆| 日韩网站在线播放| 国产精品免费久久久久| 国产一区二区精彩视频| 亚洲一区二区中文在线| 亚洲GV成人无码久久精品| 欧美三区免费完整视频在线观看| av一区二区三| 日韩精品在线视频美女| 98在线视频| 久久久久久国产三级电影| 中文字幕一区久| 成人黄色免费片| 超碰97久久| 日韩激情视频| 欧美a级一区| 日韩 欧美 高清| 黄色小说综合网站| 亚洲男女在线观看| 国产精品美女久久久久高潮| 激情五月少妇a| 色欧美乱欧美15图片| a级片免费观看| 亚洲三级 欧美三级| 精品国产白色丝袜高跟鞋| 91成人在线视频| 久久国产一级片| av爱爱亚洲一区| 在线观看免费小视频| 亚洲自拍偷拍网站| 一区二区视频免费| 亚洲第一二三四五区| 3d成人动漫在线| 97在线视频一区| 自拍偷拍亚洲图片| 蜜桃狠狠色伊人亚洲综合网站| 午夜片欧美伦| 国产精品97在线| 国产成+人+日韩+欧美+亚洲| 欧美激情视频二区| 福利精品视频在线| 国产视频www| 中文字幕免费精品一区高清| 玖玖在线播放| 成人在线免费观看一区| 国产亚洲电影| 日韩免费视频播放| 国产白丝精品91爽爽久久| 妖精视频在线观看免费| 日韩欧美国产骚| 亚洲精品一区二区三区不卡| 久久久精品欧美| 国产精品久久亚洲不卡| 精品一区在线播放| 国产一区二区三区四区三区四| 久久人人爽av| 国产人伦精品一区二区| 成年免费在线观看| 亚洲第一黄色网| 日本在线视频中文有码| 成人在线国产精品| 国产片在线观看| 日韩一级大片在线观看| 香蕉视频在线播放| 国产国产精品人在线视| 亚洲另类春色校园小说| 国产成人a亚洲精v品无码| 不卡的av中国片| 久久亚洲成人av| 欧美mv和日韩mv的网站| 羞羞的视频在线观看| 91久久综合亚洲鲁鲁五月天| 日韩欧美午夜| 老司机午夜性大片| 国产精品视频第一区| 中文字幕码精品视频网站| 国产一区二区三区在线观看网站| 在线看片福利| 日韩久久在线| 日本美女一区二区三区视频| 丰腴饱满的极品熟妇| 色欧美88888久久久久久影院| 男人天堂网在线观看| 国产成人在线视频| 波多野结衣在线观看一区二区| 国产aaaaa毛片| 国产精品久久久久久亚洲伦 | 青娱乐精品视频在线| 国产精品20p| 欧美日韩午夜影院| 精品51国产黑色丝袜高跟鞋| 成人免费福利在线| 欧美黄色aaaa| 国产精品九九视频| 岛国av一区二区| 国产福利在线看| 国产色综合天天综合网 | 欧美成人一区在线| 成人午夜大片| 日韩久久一级片| 国产精品婷婷午夜在线观看| 国产精品欧美久久久久天天影视| 欧美成年人视频| 日韩高清影视在线观看| 国产男女激情视频| 一色屋精品亚洲香蕉网站| www三级免费| 欧美综合一区第一页| 日韩av片子| 亚洲AV成人精品| 欧美日韩亚洲一区二| av国产在线观看| 97人人香蕉| 久久男女视频| 精品自拍偷拍视频| 日韩精品免费在线视频观看| 欧洲精品一区二区三区| 中文字幕中文字幕99| 99热国产精品| 一区二区的视频| 韩国一区二区电影| 欧美顶级大胆免费视频| 给我免费观看片在线电影的| 欧美亚洲精品一区| 激情av在线播放| 亚洲精品高清视频| 成人精品高清在线| 一级黄色大片免费| 久久欧美在线电影| 色欧美自拍视频| 成人无码www在线看免费| 91精品在线一区二区| 中文字幕在线高清| 最新av网址在线观看| 国产日韩欧美亚洲|