typescript - 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
我认为问题在于当我尝试使用Omit<SCHEMA, OMIT_VALUE>
body 类型时,我觉得我的验证器忽略了我的“省略 body 类型”并传递所有数据。我将不胜感激任何帮助或建议
解决方案
如果您使用的是Omit<T>
泛型,则由于 Typescript 无法反映泛型类型,因此它将不起作用。您可以使用@nestjs/mapperd-types
's OmitType()
mixin 为您创建一个新类。
export class OmitSchema extends OmitType(SchemaClass, ['fields', 'to', 'emit'] as const) {}
推荐阅读
- vue.js - 使用 feathersjs 时如何使 vuejs 应用程序与 IE 11 一起工作
- python - /rest-auth/user/ 处的 RelatedObjectDoesNotExist:用户没有用户配置文件
- networking - 带有 pouchdb 的 Electron js 离线网络
- javascript - JS中的Nan问题
- python - 如何将我的训练数据输入到这个神经网络中
- c - 如何在不更改其值的情况下获取先前设置的警报的剩余时间?
- java - 将 ContextLoaderListener 添加到 web.xml 然后我的 jsp 页面出现 404 错误
- java - Java在没有X环境或服务的情况下模拟控制台中的多个按键
- python - 如何同时为图片添加对比度和亮度等多种效果
- javascript - 在重新排列行时参数列表后丢失)