【问题标题】:How to set fallback value if validation fails (NestJS, class-validator)如果验证失败,如何设置后备值(NestJS,类验证器)
【发布时间】:2021-12-17 22:49:39
【问题描述】:

我有一个类似于下面描述的Person 类。 languages 是可选属性。它可能丢失或无效。 如果languages 丢失或无效,我不希望post call 失败。相反,我想将languages 设置为备用值,例如["en"]

我该怎么做?

我研究了自定义验证器,但这似乎不合适,因为我既想运行所有验证,也想在验证失败时更改对象。

// interface
import { IsString, MinLength, IsNotEmpty } from 'class-validator';

class Person {
  @IsNotEmpty()
  public readonly name: string;

  @IsArray()
  @IsString({ each: true })
  @MinLength(1)
  public languages: string[];  // <-- how would I specify a fallback value?
}
// controller
import { Body, Controller, Post } from "@nestjs/common";

@Controller("signup")
export class SignupController {
   @Post()
   public async submit(@Body() formData: Person) {
      // create the user object and save it to the db
   }

}

【问题讨论】:

  • 在你的类定义中加入public languages: string[] = ['en'] 怎么样?只要您为验证管道的选项设置了transform: true,就应该设置此默认值
  • @JayMcDoniel 我对nestjs 不太熟悉。即使提供了值,是否也会设置该值?例如languages: [2]我去看看
  • 如果验证失败,无论如何你都会得到一个错误。这就是 ValidationPipe 的工作原理。没有办法告诉类验证器“嘿,如果你失败了,就用这个值代替”
  • > “嘿,如果你失败了,就用这个值代替”这正是我一直在尝试做的事情
  • 我知道。使用类验证器无法立即做到这一点。您需要自己的包装器来管理错误处理。自定义管道可能会很好,但是您将无法全局绑定ValidationPipe(除非您非常聪明)

标签: typescript validation nestjs class-validator


【解决方案1】:

我最终像这样使用@Transform

import { Transform } from "class-transformer";
import { IsOptional } from 'class-validator';

class Person {
    @IsOptional()
    @Transform(({ value }) => {
        if (/* test for value validity */) {
            return value as string[];
        }
        return fallbackLanguages;
    })
    public languages: string[];
}

【讨论】:

    猜你喜欢
    • 2015-10-30
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2021-02-03
    • 2022-08-02
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    相关资源
    最近更新 更多