簡體   English   中英

如何驗證nestjs中的查詢參數

[英]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

看看下面的例子。

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

Controller內部,您可以將 Pipe 傳遞給@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

如果沒有一個驗證器符合您的需求,您還可以創建自己的裝飾器,如下所示

在我的示例中, useExclamantion -Query 參數是可選的 boolean。 請注意,傳入的查詢參數被解析為字符串。

轉換使用enableInplicitConversion -Option 完成,如 Controller 中所示:

@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM