【问题标题】:Define random default value in class-validator for each request in NestJS为 NestJS 中的每个请求在类验证器中定义随机默认值
【发布时间】:2021-10-22 13:35:57
【问题描述】:

如何为每个请求指定一个具有默认值的字段?不适用于所有请求。我知道如何在类验证器中传递字段的默认值:

export class CreateUserDto {
  @IsString()
  username = "static-username";
}

但是这段代码会导致所有请求的静态默认值,但是我需要为每个请求生成一个用户名。注意:我知道我可以在控制器中处理这些类型的问题/问题。但我认为最好在验证器中处理它。在以下示例中,您可以通过在控制器中处理随机值来了解我的意思:

class CreateUserDto {
  @IsOptional()
  @IsString()
  username?: string;
}

/* ... */
@Post('/users')
async createUser(@Body user: CreateUserDto) {
  if (user.username === undefined) {
    user.username = `random-${Math.random()}`
  }
}
/* ... */

【问题讨论】:

标签: node.js validation nestjs default-value class-validator


【解决方案1】:

您只能在 DTO 中发回静态值是不正确的。你可以这样做:

class CreateUserDto {
  @IsOptional()
  @IsString()
  username: string = `random-${Math.random()}`
}

/* ... */
@Post('/users')
async createUser(@Body(new ValidationPipe({ whitelist: true })) user: CreateUserDto) {
  console.log(user.username) // random-0.8392092045730202
}
/* ... */

也许您在测试时遇到的问题是您没有启用 ValidationPipe:@Body user: CreateUserDto 必须是 @Body(ValidationPipe) user: CreateUserDto。使用whitelist: true,您还将删除所有未定义的键值对,这非常有用。

【讨论】:

  • 是的,我没有注意到应该为每个传入的请求运行一次 DTO。现在它的系统变得更加清晰了。
  • 这个验证管道会覆盖全局验证管道吗?
  • @AliSherafat 是的,当您在全球范围内编写一个时,它将在任何地方使用。当您在函数中编写一个时,它将覆盖全局的。
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2021-09-24
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多