如何在 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.
一起使用
看看下面的例子。
在 Controller 中,您可以将管道传递给 @Query()
-Decorator。
您可以使用 Nest 已附带的 ValidationPipe
并利用 class-validator
和 class-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
有关将 ValidationPipe
与 class-validator
一起使用的更多信息,您可以查看 NestJS 文档:
https://docs.nestjs.com/techniques/validation
对于您的特定用例(验证 MongoDB ID),我发现了一个未解决的问题,其中包含 @IsMongoDB
-Decorator 的示例实现:
https://github.com/typestack/class-validator/issues/630#issuecomment-645638436
哟,我有使用 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.
看看下面的例子。
在 Controller 中,您可以将管道传递给 @Query()
-Decorator。
您可以使用 Nest 已附带的 ValidationPipe
并利用 class-validator
和 class-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
有关将 ValidationPipe
与 class-validator
一起使用的更多信息,您可以查看 NestJS 文档:
https://docs.nestjs.com/techniques/validation
对于您的特定用例(验证 MongoDB ID),我发现了一个未解决的问题,其中包含 @IsMongoDB
-Decorator 的示例实现:
https://github.com/typestack/class-validator/issues/630#issuecomment-645638436