在我的API中,我创建了允许通过分页从数据库获取用户的端点:
@Get()
findByQuery(
@Query() { skip, take, count }: QueryDto
): Promise<User[] | { rows: User[]; count: number }> {
return this.userService.findByQuery(skip, take, count);
}在使用QueryDto的class-validator中,我为值制作了验证器,并为这些值使用了class-transformer解析器,因为默认情况下,它们只是字符串。
import { Transform } from 'class-transformer';
import { IsBoolean, IsNumber, IsOptional } from 'class-validator';
export class QueryDto {
@Transform(({ value }) => parseInt(value))
@IsNumber()
skip: number;
@Transform(({ value }) => parseInt(value))
@IsNumber()
take: number;
@Transform(({ value }) => {
return value === 'true';
})
@IsOptional()
@IsBoolean()
count?: boolean;
}问题是,count字段的最后一个验证器无法工作。在服役中,它仍然只是字符串。
因此,例如,如果我确实这样请求- http://localhost:3000/api/user?skip=1&take=1&count=false - skip和take被正确地解析为数字,但是count总是字符串。
我怎么才能解决这个问题?
PS.
此外,我已经创建了自定义验证管道,现在我确信,如果问题可能出现在这里:
import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';
import { ValidationException } from '../exception/validation.exception';
@Injectable()
export class ValidationPipe implements PipeTransform<any> {
async transform(value: any, metadata: ArgumentMetadata): Promise<any> {
const obj = plainToInstance(metadata.metatype, value);
const errors = await validate(obj);
if (errors.length) {
const messages = errors.map((err) => {
return {
[err.property]: `${Object.values(err.constraints).join(', ')}`
};
});
throw new ValidationException({ errors: messages });
}
return value;
}
}发布于 2022-08-22 14:39:05
您的自定义管道应该返回obj。value是原始查询。我测试了你的代码。字段skip和take都是字符串。最后,建议使用内置ValidationPipe。
https://stackoverflow.com/questions/73435053
复制相似问题