如何验证nestjs中的查询参数

mxx*_*eat 20 javascript design-patterns node.js nestjs

哟,我有 Nestjs 的商店应用程序,我需要验证 mongo id,这是通过查询传递的,问题是我也传递和搜索查询。我编写了验证所有值的管道,并排除了此搜索查询

\n
@Injectable()\nexport class ValidationObjectId implements PipeTransform {\n    transform(value: UniqueId, metadata: ArgumentMetadata) {\n        if (\n            !Types.ObjectId.isValid(value) &&\n            metadata.data !== "searchString"\n        ) {\n            throw new BadRequestException("\xd0\x9d\xd0\xb5\xd0\xb2\xd0\xb5\xd1\x80\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xb0\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80 \xd0\xb7\xd0\xb0\xd0\xbf\xd1\x80\xd0\xbe\xd1\x81\xd0\xb0");\n        }\n\n        return value;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但此代码不可重用于其他情况。我想要一些例子,我该怎么做

\n

小智 44

最干净、最可重用的方法可能是使用ValidationPipeQuery-DTO-Class。

看一下下面的例子。

https://gitlab.com/WaldemarLehner/nestjs-swagger-example/-/tree/1aea48597ddcf93b0a0d1449fe5087413415bbee

在控制器内部,您可以将管道传递给@Query()-Decorator。您可以使用ValidationPipeNest 自带的 并利用class-validatorclass-transformer软件包。

您可以为您的查询参数创建一个 DTO 类,如我示例中的PostHelloQuery.dto.ts中所做的那样。

import { IsBoolean, IsOptional } from "class-validator";

export class PostHelloQueryDTO {
    @IsOptional()
    @IsBoolean()
    public useExclamation?: boolean;
}
Run Code Online (Sandbox Code Playgroud)

在这里,您使用来自 的装饰器定义数据的约束class-validator。有关所有装饰器的列表,请参阅https://github.com/typestack/class-validator#validation-decorators

如果没有一个验证器满足您的需求,您还可以创建自己的装饰器,如下所示

在我的示例中,useExclamation-Query Param 是一个可选的布尔值。请注意,传入的查询参数被解析为字符串。

转换是使用enableInplicitConversion-Option 完成的,如控制器中所示:

@Query(new ValidationPipe({
    transform: true,
    transformOptions: {enableImplicitConversion: true},
    forbidNonWhitelisted: true
})) query: PostHelloQueryDTO
Run Code Online (Sandbox Code Playgroud)

有关使用ValidationPipewith的更多信息class-validator,您可以查看 NestJS 文档:

https://docs.nestjs.com/techniques/validation

对于您的特定用例(验证 MongoDB ID),我发现了一个未解决的问题,其中包含 -Decorator 的示例实现@IsMongoDB

https://github.com/typestack/class-validator/issues/630#issuecomment-645638436

  • @AmeerHamza 使用来自 `class-transformer` (https://github.com/typestack/class-transformer#working-with-nested-objects) 的 `@Type` 和来自 `class-validator` 的 `@ValidateNested` 的组合(https://github.com/typestack/class-validator#validating-nested-objects)。否则,一切都一样。 (3认同)