Javascript 是否可以验证单个路由参数?
假设我有以下路线:Javascript 是否可以验证单个路由参数?,javascript,node.js,typescript,nestjs,class-validator,Javascript,Node.js,Typescript,Nestjs,Class Validator,假设我有以下路线: companies/{companyId}/departments/{departmentId}/employees 是否可以分别验证两个资源ID(companyId,departmentId)呢?我试过跟随,但不起作用 class ResourceId { @IsNumberString() @StringNumberRange(...) // my custom validator id: number; } @Get(':companyId/depart
companies/{companyId}/departments/{departmentId}/employees
是否可以分别验证两个资源ID(companyId
,departmentId
)呢?我试过跟随,但不起作用
class ResourceId {
@IsNumberString()
@StringNumberRange(...) // my custom validator
id: number;
}
@Get(':companyId/departments/:departmentId/employees')
getEmployees(
@Param('companyId') companyId: ResourceId,
@Param('departmentId') departmentId: ResourceId,
) {}
我有多个情况,当一个路由中有多个参数时。我不想为每个路由创建单独的验证类。有没有其他方法来处理这个问题?问题是这里有一个普通字符串。要使用
类验证器进行验证
,您必须实例化一个类,在您的例子中是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;
}
}
}
然后,您可以在控制器上使用它:
@UsePipes(ParamValidationPipe)
@Get(':companyId/departments/:departmentId/employees')
getEmployees(
@Param('companyId') companyId: ResourceId,
@Param('departmentId') departmentId: ResourceId,
) {
return `id1: ${companyId.id}, id2: ${departmentId.id}`;
}
您还可以使用在一次调用中执行所有转换、验证和检查错误列表步骤:)要点:-)我不会改变我的答案,因为添加关于安装另一个软件包的注释会使它变得更长,但我认为这是一个非常有用的注释。