mxx*_*eat 20 javascript design-patterns node.js nestjs
哟,我有 Nestjs 的商店应用程序,我需要验证 mongo id,这是通过查询传递的,问题是我也传递和搜索查询。我编写了验证所有值的管道,并排除了此搜索查询
\n@Injectable()\nexport class ValidationObjectId implements PipeTransform {\n transform(value: UniqueId, metadata: ArgumentMetadata) {\n if (\n !Types.ObjectId.isValid(value) &&\n metadata.data !== "searchString"\n ) {\n throw new BadRequestException("\xd0\x9d\xd0\xb5\xd0\xb2\xd0\xb5\xd1\x80\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xb0\xd1\x80\xd0\xb0\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80 \xd0\xb7\xd0\xb0\xd0\xbf\xd1\x80\xd0\xbe\xd1\x81\xd0\xb0");\n }\n\n return value;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n但此代码不可重用于其他情况。我想要一些例子,我该怎么做
\n小智 44
最干净、最可重用的方法可能是使用ValidationPipeQuery-DTO-Class。
看一下下面的例子。
在控制器内部,您可以将管道传递给@Query()-Decorator。您可以使用ValidationPipeNest 自带的 并利用class-validator和class-transformer软件包。
您可以为您的查询参数创建一个 DTO 类,如我示例中的PostHelloQuery.dto.ts中所做的那样。
import { IsBoolean, IsOptional } from "class-validator";
export class PostHelloQueryDTO {
@IsOptional()
@IsBoolean()
public useExclamation?: boolean;
}
Run Code Online (Sandbox Code Playgroud)
在这里,您使用来自 的装饰器定义数据的约束class-validator。有关所有装饰器的列表,请参阅https://github.com/typestack/class-validator#validation-decorators。
如果没有一个验证器满足您的需求,您还可以创建自己的装饰器,如下所示。
在我的示例中,useExclamation-Query Param 是一个可选的布尔值。请注意,传入的查询参数被解析为字符串。
转换是使用enableInplicitConversion-Option 完成的,如控制器中所示:
@Query(new ValidationPipe({
transform: true,
transformOptions: {enableImplicitConversion: true},
forbidNonWhitelisted: true
})) query: PostHelloQueryDTO
Run Code Online (Sandbox Code Playgroud)
有关使用ValidationPipewith的更多信息class-validator,您可以查看 NestJS 文档:
https://docs.nestjs.com/techniques/validation
对于您的特定用例(验证 MongoDB ID),我发现了一个未解决的问题,其中包含 -Decorator 的示例实现@IsMongoDB:
https://github.com/typestack/class-validator/issues/630#issuecomment-645638436
| 归档时间: |
|
| 查看次数: |
51588 次 |
| 最近记录: |