【问题标题】:How validate query params in nestjs如何验证nestjs中的查询参数
【发布时间】:2021-12-04 12:23:24
【问题描述】:

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

@Injectable()
export class ValidationObjectId implements PipeTransform {
    transform(value: UniqueId, metadata: ArgumentMetadata) {
        if (
            !Types.ObjectId.isValid(value) &&
            metadata.data !== "searchString"
        ) {
            throw new BadRequestException("Неверный параметр запроса");
        }

        return value;
    }
}

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

【问题讨论】:

    标签: javascript node.js design-patterns nestjs


    【解决方案1】:

    最干净和最可重用的方法可能是使用 ValidationPipe 和 Query-DTO-Class。

    看看下面的例子。

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

    Controller 中,您可以将管道传递给@Query()-装饰器。 您可以使用 Nest 自带的 ValidationPipe 并使用 class-validatorclass-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

    如果没有一个验证器符合您的需求,您还可以创建自己的装饰器,如 here 所示。

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

    使用控制器中的enableInplicitConversion-Option 完成转换:

    @Query(new ValidationPipe({
        transform: true,
        transformOptions: {enableImplicitConversion: true},
        forbidNonWhitelisted: true
    }) query: PostHelloQueryDTO
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 2023-02-14
      • 2017-01-12
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 2019-08-29
      • 2022-08-17
      • 2018-03-10
      相关资源
      最近更新 更多