为了账号安全,请及时绑定邮箱和手机立即绑定

NestJs:使用类验证器验证对象数组

NestJs:使用类验证器验证对象数组

Cats萌萌 2023-09-07 10:12:18
我正在尝试对数组的每个项目强制执行验证。根据我的理解(如果我错了,请纠正我),类验证器不支持直接验证数组。它需要我们创建一个包装类。因此,以下是课程: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[];}以下是我的控制器:  @Get("getSequence")  async getSequence(@Body() query:SequenceQueries) {    return await this.sequenceService.getNextSequenceNew(query)  }以下是我传递给控制器的 JSON:{"queries":  [    {        "collection": "A",        "identifier": "abc",        "count": 1    },    {        "collection": "B",        "identifier": "mno",        "count": 5    },    {        "collection": "C",        "identifier": "xyz",        "count": 25    }]}但它似乎不起作用。它不会抛出任何验证消息。
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

我得到了问题的解决方案。


我应该将我的包装类更改为:


export class SequenceQueries{

    @ValidateNested({ each: true })

    @Type(() => SequenceQuery) // added @Type

    queries:SequenceQuery[];

}

但我将保留这个问题,以防万一有人有替代解决方案,例如不必创建包装类。


查看完整回答
反对 回复 2023-09-07
?
慕标5832272

TA贡献1966条经验 获得超4个赞

Nestjs 中有我完整的解决方案/实现


首先创建我的 DTO 类

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[];

}

将我的 DTO 类放入我的控制器定义中

  @MessagePattern('set_webhooks')

  async setWebhooks(

    @Payload('body') webhookDtoArray: WebhookDtoArray,

    @Payload() data,

  ): Promise<Store> {

    return this.storeManagementService.setWebhooks(

      data.userPayload.id,

      webhookDtoArray,

    );

  }

邮递员中我应该发送的正文的示例

{

  "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

    }

  ]

}


查看完整回答
反对 回复 2023-09-07
?
www说

TA贡献1775条经验 获得超8个赞

class-validator 确实支持数组验证,您只需添加您在 @ValidateNested( { every: true } ) 中所做的操作,您只需将 every 添加到集合元素中:


export class SequenceQuery {   

@MinLength(10, {

    each: true,

    message: 'collection name is too short',

  })

collection: string;

identifier: string;

count: number;

}

查看完整回答
反对 回复 2023-09-07
  • 3 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信