考虑控制器中的以下路由:
@Get('/:uuid')
findById(@Param() params: FindProjectParamsDto): Promise<Project> {
return this.projectsService.findById(params);
}
字符串
假设FindProjectParamsDto
是这样定义的:
export class FindProjectParamsDto extends PickType(ProjectDto, [
'id',
] as const) {}
型
(or没有被Map,但只包含id
属性)。让我们也说这个属性也有像@IsNotEmpty()
或@IsUUID()
这样的验证器。
你可以很容易地发现一个问题:在请求中,提取的路由参数是uuid
,而params
应该有id
,因此id
是空的。这样的请求总是失败,因为验证器会导致这样的响应:
{
"statusCode": 400,
"message": [
"id must be a UUID",
"id should not be empty"
],
"error": "Bad Request"
}
型
我想知道这样的问题是否可以通过静态代码分析器自动防止。显然,TypeScript本身并没有发现这一点,因为它不关心路由字符串的内容。但可能已经有一个标准的解决方案,这对Nest.js?
可能是一个标准的自动测试,它采用DTO,使用验证器和/或示例填充路由中的值(来自@ApiProperty
),将其传递给控制器并检查它是否使其无效?(因为用有效值替换":id"
后,"/:uuid"
仍然是"/:uuid"
,因此测试将失败)这样的测试将给出给予假阴性结果,但是:在DTO中,"/:isGoodEnough"
和isGood
可能会给予类似{ isGood: "trueEnough" }
的结果,但这显然比没有验证要好(最后,如果isGood
有@IsBooleanString()
,{ isGood: "trueEnough" }
就不会通过)。
注意事项:如果自动测试方法可以同时应用于所有路由,那么它就足够好了;为每个路由编写特定的自动测试开销太大。
PS:this project使用自定义eslint规则执行a similar thing,但仅适用于非DTO参数。这可能是一种可以用来处理此问题的方法。
1条答案
按热度按时间fykwrbwg1#
字符串
你可以这样做没有dto。