【问题标题】:Transform the @Body without requiring it in NestJs在 NestJs 中转换 @Body 而不需要它
【发布时间】:2021-07-13 18:06:32
【问题描述】:

我基本上想要做的是将请求中的日期字符串解析为 Date 对象,例如 question

但是,这不是我的用例,因为在我的情况下不需要日期。因此,如果我使用上述问题的解决方案,它会以 400 响应:due must be a Date instance

这是我的 DTO:

export class CreateTaskDto {
    @IsDefined()
    @IsString()
    readonly name: string;

    @IsDefined()
    @IsBoolean()
    readonly done: boolean;

    @Type(() => Date)
    @IsDate()
    readonly due: Date;
}

然后在我的控制器中:

@Post('tasks')
async create(
    @Body(new ValidationPipe({transform: true}))
    createTaskDto: CreateTaskDto
): Promise<TaskResponse> {
    const task = await this.taskService.create(createTaskDto);
    return this.taskService.fromDb(task);
}

使用此有效负载的发布请求工作正常:

{
    "name":"task 1",
    "done":false,
    "due": "2021-07-13T17:30:11.517Z"
}

但是这个请求失败了:

{
    "name":"task 2",
    "done":false
}
{
   "statusCode":400
   "message":["due must be a Date instance"],
   "error":"Bad Request"
}

如果没有日期,是否有可能告诉nestjs忽略转换?

【问题讨论】:

  • 我可能在这里遗漏了一些东西,但您是否尝试将 due 字段设为可选? -- 例如,Date | undefined
  • 您应该在属性中添加@IsOptional()。让我知道这是否有效
  • @JayMcDoniel 是的,它有效。我不知道那个装饰器。

标签: nestjs


【解决方案1】:

@IsOptional()

检查给定值是否为空(=== null,=== 未定义),如果是,则忽略属性上的所有验证器。

https://github.com/typestack/class-validator#validation-decorators

  @Type(() => Date)
  @IsDate()
  @IsOptional()
  readonly due?: Date;

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 2015-12-13
    • 1970-01-01
    • 2014-03-05
    • 2012-09-08
    • 2021-03-19
    • 2013-05-08
    • 2021-10-22
    相关资源
    最近更新 更多