Гнездо JS - проверка / сериализация по-разному в зависимости от формы запроса - PullRequest
0 голосов
/ 12 января 2020

Мне нужно проверить запрос, который может иметь 3 различные формы, основываясь на свойстве тела, называемом «status», это будет необходимо и для сериализации

Как мне это сделать?

Примеры тела запросов:

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

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

Я бы хорошо сделал класс для каждого типа запроса, но как бы я условно использовать один или другой?

1 Ответ

0 голосов
/ 13 января 2020

Для этого вы можете использовать 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

...