【问题标题】:NestJS - Validate/Serialize differently based on request shapeNestJS - 根据请求形状不同地验证/序列化
【发布时间】:2020-01-13 17:33:32
【问题描述】:

我需要根据主体上称为“状态”的属性验证可能具有 3 种不同形状的请求,这也是序列化所需要的

我该怎么做?

请求正文示例:

{ "status" : "training", "trainingSetId": "dijado389828", "fileData": { "fileUrl": someurl, "nRows": 4000" } }

{ "status" : "test", "testSetId": "ddadfaax344x", "someOtherProp": "idk", "fileData": { "fileUrl": someurl, "nRows": 4000", "predictionFileUrl": someotherurl } }

我可以为每种请求类型创建一个类,但我将如何有条件地使用其中一个?

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    您可以使用https://docs.nestjs.com/pipes#object-schema-validation,如下所示:

    import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
    
    @Injectable()
    export class JoiValidationPipe implements PipeTransform {
      constructor(private readonly schema: Object) {}
    
      transform(value: any, metadata: ArgumentMetadata) {
        const { error } = this.schema.validate(value);
        if (error) {
          throw new BadRequestException('Validation failed');
        }
        return value;
      }
    }
    

    schema 可以在不同的文件中定义,并且可以在控制器中使用 Pipe 时作为参数传递,模式对象示例:

    export const schema = Joi.object({
        status: Joi.string().valid('training', 'test'),
        rest_keys: Joi.any()
    })
        .when(Joi.object({ status: Joi.exist() }).unknown(), {
            then: Joi.object({
                rest_key: Joi.valid('some_value or required')
            }),
            otherwise: Joi.object({
                a: Joi.valid('similar as above')
            })
    });
    

    您可以阅读更多关于使用 Joi 进行条件验证的信息https://hapi.dev/family/joi/api/?v=17.0.2#anywhencondition-options

    【讨论】:

    • 你给出了一个很好的答案,但我正在寻找类验证器的答案,我可能应该指定,我认为这是嵌套的标准
    • 但是使用class-validator将很难实现您的目标,顺便说一句,Joi也是验证输入的nestjs方式之一,但是up2u
    猜你喜欢
    • 2021-07-25
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    相关资源
    最近更新 更多