gpt4 book ai didi

javascript - 是否可以验证单个路由参数?

转载 作者:搜寻专家 更新时间:2023-10-30 21:45:44 27 4
gpt4 key购买 nike

假设我有以下路线:

companies/{companyId}/departments/{departmentId}/employees

是否可以分别验证两个资源 ID(companyIddepartmentId)?我试过关注,但没用。

class ResourceId {
@IsNumberString()
@StringNumberRange(...) // my custom validator
id: number;
}

@Get(':companyId/departments/:departmentId/employees')
getEmployees(
@Param('companyId') companyId: ResourceId,
@Param('departmentId') departmentId: ResourceId,
) {}

当单个路由中有多个参数时,我有多种情况。我不想为每条路线创建单独的验证类。有没有办法以不同的方式处理这个问题?

最佳答案

问题是你这里有一个纯字符串。要使用 class-validator 进行验证,您必须实例化一个类,在您的例子中为 ResourceId。内置的 ValidationPipe 期望值为 {id: '123'} 而不是 '123' 以便能够自动转换它。但是您可以轻松地创建自己的验证管道,它可以完成这种额外的转换。

export class ParamValidationPipe implements PipeTransform {
async transform(value, metadata: ArgumentMetadata) {
if (metadata.type === 'param') {
// This is the relevant part: value -> { id: value }
const valueInstance = plainToClass(metadata.metatype, { id: value });
const validationErrors = await validate(valueInstance);
if (validationErrors.length > 0) {
throw new BadRequestException(validationErrors, 'Invalid route param');
}
return valueInstance;
} else {
return value;
}
}
}

然后您可以在您的 Controller 上使用它:

@UsePipes(ParamValidationPipe)
@Get(':companyId/departments/:departmentId/employees')
getEmployees(
@Param('companyId') companyId: ResourceId,
@Param('departmentId') departmentId: ResourceId,
) {
return `id1: ${companyId.id}, id2: ${departmentId.id}`;
}

关于javascript - 是否可以验证单个路由参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55385041/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com