![](/img/trans.png)
[英]Hapijs and Joi: validate query params with presence: 'forbidden'
[英]How validate query params in nestjs
哟,我有使用nestjs的商店应用程序,我需要验证mongo id,这是通过查询传递的,问题是我也通过和搜索查询。 我写 pipe 验证所有值,并排除此搜索查询
@Injectable()
export class ValidationObjectId implements PipeTransform {
transform(value: UniqueId, metadata: ArgumentMetadata) {
if (
!Types.ObjectId.isValid(value) &&
metadata.data !== "searchString"
) {
throw new BadRequestException("Неверный параметр запроса");
}
return value;
}
}
但是此代码不可用于其他情况。 我想要一些例子,我该怎么做
最干净和最可重用的方法可能是使用带有 Query-DTO-Class 的ValidationPipe
。
看看下面的例子。
在Controller内部,您可以将 Pipe 传递给@Query()
-装饰器。 您可以使用 Nest 自带的ValidationPipe
,并使用class-validator
和class-transformer
器包。
您可以像我的示例中的PostHelloQuery.dto.ts中所做的那样为您的查询参数创建一个 DTO 类。
import { IsBoolean, IsOptional } from "class-validator";
class PostHelloQueryDTO {
@IsOptional()
@IsBoolean()
public useExclamation?: boolean;
}
在这里,您使用来自class-validator
装饰器为您的数据定义约束。 有关所有装饰器的列表,请参阅https://github.com/typestack/class-validator#validation-decorators 。
如果没有一个验证器符合您的需求,您还可以创建自己的装饰器,如下所示。
在我的示例中, useExclamantion
-Query 参数是可选的 boolean。 请注意,传入的查询参数被解析为字符串。
转换使用enableInplicitConversion
-Option 完成,如 Controller 中所示:
@Query(new ValidationPipe({
transform: true,
transformOptions: {enableImplicitConversion: true},
forbidNonWhitelisted: true
}) query: PostHelloQueryDTO
有关将ValidationPipe
与class-validator
一起使用的更多信息,您可以查看 NestJS 文档:
https://docs.nestjs.com/techniques/validation
对于您的特定用例(验证 MongoDB ID),我发现了一个带有@IsMongoDB
-Decorator 示例实现的未解决问题:
https://github.com/typestack/class-validator/issues/630#issuecomment-645638436
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.