首页 > 解决方案 > ValidationPipes 不适用于 Body 特定类型

问题描述

我有一个简单的问题。我正在尝试将 a 应用于ValidationPipe我的一个端点,即 POST 此端点的职责很简单 - 添加发票,但在此之前我想验证正文。

所以我这样做了:

发票.dto.ts

import { ContractorDto } from './contractor.dto';
import { IncomeDto } from './income.dto';
import { ExpensesDto } from './expenses.dto';
import {
    IdValidator,
    PositionValidator,
    DateOfEventValidator,
    DescriptionValidator,
    RegistryValidator,
    ContractorValidator,
    IncomeValidator,
    ExpensesValidator,
} from '../helpers/invoiceValidation.decorator';

export class InvoiceDto {
    @IdValidator() id: string;
    @PositionValidator() position: number;
    @DateOfEventValidator() dateOfEvent: string;
    @RegistryValidator() registry: string;
    @DescriptionValidator() description: string;
    @ContractorValidator() contractor: ContractorDto;
    @IncomeValidator() income: IncomeDto;
    @ExpensesValidator() expenses: ExpensesDto;
}

发票.controller.ts

type XYZ = Omit<InvoiceDto, 'id'>;

@Post('/add')
addInvoice(
    @Res() res: Response,
    @Body(
        new ValidationPipe({
            transform: true,
            disableErrorMessages: false,
            always: true,
            stopAtFirstError: true,
            validateCustomDecorators: true,
            skipMissingProperties: false,
        })
    )
    body: XYZ, // here is a problem, when I'm using InvoiceDto - validation works, but when i try to use Omit it doesnt work
) {
    // I dont neet to validate ID field because I will generate it on backend
    const invoice = this.invoicesService.addInvoice(body);
    return res.json(invoice);
}

invoiceValidation.decorator.ts

export function IdValidator() {
    return applyDecorators(
        IsDefined({ message: 'ID of an inovice is required!' }),
        IsString({ message: 'ID must be a string!' }),
        Length(21, 21, { message: 'ID is not valid!' }),
    );
}

export function PositionValidator() {
    return applyDecorators(
        IsDefined({ message: 'Position of invoice is required!' }),
        IsNotEmpty(),
        IsInt({ message: 'Position of invoice must be a number' }),
        Min(1, { message: 'Position of invoice must be greater than 0' }),
    );
}

export function DateOfEventValidator() {
    return applyDecorators(
        IsDefined({ message: 'Date of invoice event is required!' }),
        IsOnlyDate(),
    );
}

  // I've just add a couple of validators

GIST 备份在这里

我认为问题在于当我尝试使用Omit<SCHEMA, OMIT_VALUE>body 类型时,我觉得我的验证器忽略了我的“省略 body 类型”并传递所有数据。我将不胜感激任何帮助或建议

标签: typescriptpipenestjsclass-validator

解决方案


如果您使用的是Omit<T>泛型,则由于 Typescript 无法反映泛型类型,因此它将不起作用。您可以使用@nestjs/mapperd-types's OmitType()mixin 为您创建一个新类。

export class OmitSchema extends OmitType(SchemaClass, ['fields', 'to', 'emit'] as const) {}

推荐阅读