如何在 nestjs 中验证查询参数

How validate query params in nestjs

哟,我有使用 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;
    }
}

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

最干净和最可重用的方法可能是将 ValidationPipe 与 Query-DTO-Class.

一起使用

看看下面的例子。

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

Controller 中,您可以将管道传递给 @Query()-Decorator。 您可以使用 Nest 已附带的 ValidationPipe 并利用 class-validatorclass-transformer 包。

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

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

class PostHelloQueryDTO {
    @IsOptional()
    @IsBoolean()
    public useExclamation?: boolean;
}

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

如果 none 个验证器满足您的需要,您还可以创建自己的装饰器,如图 here

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

转换是使用控制器中看到的 enableInplicitConversion-选项完成的:

@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