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