typescript 我可以通过静态分析器(编译时)或非特定的自动测试来防止Nest.js路由模式及其参数DTO的不匹配吗?

balp4ylt  于 6个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(49)

考虑控制器中的以下路由:

@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参数。这可能是一种可以用来处理此问题的方法。

fykwrbwg

fykwrbwg1#

@Get('/:uuid')
findById(@Param() param: string): Promise<Project> {
return this.projectsService.findById(param.uuid);
}

字符串
你可以这样做没有dto。

相关问题