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

  1. 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[];
}
  1. 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,
    );
  }
  1. 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
    }
  ]
}

Relaterade artiklar