任務是nest.js在管理應用程式之前驗證應用程式中的有效負載。每個有效負載可以包含tag物件 (1 - 11)。每個tag object只能有一個屬性和值(屬性由請求決定)
標簽物件應該被驗證:
- 屬性應該是一個字串,接受任何字符
:,大小在 1-255 之間 - 值應該是一個大小在 1-255 之間的字串
任務看起來很簡單。但我不知道如何驗證Tag物件中動態構造的屬性。
DTO 是(使用配置的驗證class-validator):
import {
ArrayMaxSize,
ArrayMinSize,
IsArray,
IsDefined,
IsNotEmpty,
IsObject,
IsString,
Matches,
MinLength,
ValidateNested
} from 'class-validator';
export class Payload {
...
@IsArray()
@ArrayMinSize(1)
@ArrayMaxSize(11)
@ValidateType(() => Tag)
@ValidateNested()
@ApiProperty()
tags: Tag[];
}
為了Tag靈活(因為未知的屬性名稱),它像Map擴展一樣
export class Tag extends Map<string, string>{
}
或單個欄位物件
export class Tag {
[key: string]: string;
}
如何管理每個所需的驗證Tag?
(排除輸入的:正則運算式is/^[^:] $/并且應該申請key)
uj5u.com熱心網友回復:
我有解決方案,但比解決方案實作更好地比較可能的方法。
1 個場景
是在tags欄位上放置額外的自定義驗證裝飾器
@IsPropertyNameLength(1, 250,{ each: true })
@IsPropertyNameMatches(/^[^:] $/,{ each: true })
@IsPropertyNameString({ each: true })
@IsKeyNameLength(1, 250,{ each: true })
@IsKeyNameMatches(/\w |\d /,{ each: true })
@IsKeyNameString({ each: true })
tags: Tag[];
這可能是一個很好的解決方案。按照這種方式,我們會意識到裝飾器名稱不會帶來足夠的資訊。為了讓它們更通用,我們可以添加更多引數。但是這種改進并不能改變我們驗證不是當前或下一級屬性的事實。我們在下一個級別 ( tags[]-> Tag-> theProperty)上對屬性進行驗證。
2 場景
是管理中間件層的驗證。如果您希望報告格式相同并且流程與 中提供的相同,這可能會帶來一些困難,class-validator但好處是我們可以對不同的方法進行驗證,從而構建更復雜的驗證樹。也很容易測驗。
3 方案 是拒絕動態屬性名稱(如果可能)并考慮開發替代模型,例如
export class Tag {
key: string;
value: string;
}
例如,它讓我們有機會使用我們提供的裝飾器來class-validator滿足我們的需要
export class Tag {
@Length(1, 250)
@Matches(/^[^:] $/)
key: string;
@Length(1, 250)
@Matches(/\w |\d /)
value: string;
}
聚苯乙烯
我已經按照第三種方式管理了我的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/365901.html
