javascript - NestJs: Validera array av objekt med class-validator
Jag försöker genomdriva en validering på varje objekt i en array.
Enligt min förståelse (vänligen korrigera mig om jag har fel), stöder inte class-validator direkt validering av arrayer. Det kräver att vi skapar en omslagsklass.
Så, följande är klasserna:
export class SequenceQuery {
@MinLength(10, {
message: 'collection name is too short',
})
collection: string;
identifier: string;
count: number;
}
export class SequenceQueries{
@ValidateNested({ each: true })
queries:SequenceQuery[];
}
Och följande är min kontroller:
@Get("getSequence")
async getSequence(@Body() query:SequenceQueries) {
return await this.sequenceService.getNextSequenceNew(query)
}
{"queries": [
{
"collection": "A",
"identifier": "abc",
"count": 1
},
{
"collection": "B",
"identifier": "mno",
"count": 5
},
{
"collection": "C",
"identifier": "xyz",
"count": 25
}
]}
Men det verkar inte fungera. Det visar inga valideringsmeddelanden.
Svar #1
Jag fick lösningen på problemet.
Jag skulle ändra min wrapper-klass till :
export class SequenceQueries{
@ValidateNested({ each: true })
@Type(() => SequenceQuery) // added @Type
queries:SequenceQuery[];
}
Men jag kommer att lämna frågan öppen, bara ifall någon har en alternativ lösning som inte innebär att man måste skapa en wrapper-klass.
Svar #2
Här är min kompletta lösning/implementering i Nestjs
- Skapa först min DTO-klass
export class WebhookDto {
@IsString()
@IsEnum(WebHookType)
type: string;
@IsString()
@IsUrl()
url: string;
@IsBoolean()
active: boolean;
}
export class WebhookDtoArray {
@IsArray()
@ValidateNested({ each: true })
@Type(() => WebhookDto)
webhooks: WebhookDto[];
}
- Placera min DTO-klass i min controllerdefinition
@MessagePattern('set_webhooks')
async setWebhooks(
@Payload('body') webhookDtoArray: WebhookDtoArray,
@Payload() data,
): Promise<Store> {
return this.storeManagementService.setWebhooks(
data.userPayload.id,
webhookDtoArray,
);
}
- Ett exempel i Postman på vilken Body jag borde skicka
{
"webhooks": [{
"type": "InvoiceCreated",
"url": "https://test.free.beeceptor.com",
"active": true
},
{
"type": "InvoiceSettled",
"url": "https://test.free.beeceptor.com",
"active": true
},
{
"type": "InvoiceExpired",
"url": "https://test.free.beeceptor.com",
"active": true
}
]
}
