我正在构建一个 NestJS 应用程序,我正在尝试使用 aValidationPipe
来验证我的请求正文和查询参数。我的ValidationPipe
样子是这样的(为简单起见,省略了一些代码):
@Injectable()
export class ValidationPipe implements PipeTransform<any> {
private readonly groups?: string[];
constructor(groups?: string[]) {
this.groups = groups;
}
async transform(value: any, { metatype }: ArgumentMetadata) {
if (!metatype || !this.toValidate(metatype)) {
return value;
}
const object = plainToClass(metatype, value);
const errors = await validate(object, {
groups: this.groups,
});
if (errors.length > 0) {
const violations: Violation[] = [];
errors.forEach(error => {
const firstConstraint = getFirstConstraint(
Object.keys(error.constraints),
);
violations.push(
mapConstraintToViolation(firstConstraint, error.property),
);
});
throw new BadRequestException(new ValidationFailure(violations));
}
return value;
}
}
另外,我有一个带有这个签名的控制器方法:
@UseInterceptors(ClassSerializerInterceptor)
@Put(':id')
async update(
@Param('id', new ValidationPipe()) updateParams: UpdateParams,
@Body(new ValidationPipe(['update'])) userManagementDto: UserManagementDto,
): Promise<UserManagementDto>;
请求正文验证工作正常。我的UserManagementDto
正确解析和验证。但是 id 参数的验证不能正常工作。id 参数被序列化为纯字符串(如您在打印屏幕中所见):
UpdateParams
类是这样的:
import { IsUUID } from 'class-validator';
export class UpdateParams {
@IsUUID()
id: string;
}
我以PUT
这种方式提出请求:
PUT /users/f10ac0de-0783-48ad-b9bf-c3ba77f8ed06 HTTP/1.1
Host: localhost:3000
Content-Type: application/json
{
"name": "Bruno Peres",
"email": "bruno3@domain.com.br"
}
我ValidationPipe
以框架文档提供的示例为基础。
我究竟做错了什么?谢谢您的帮助!