Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以验证单个路由参数?_Javascript_Node.js_Typescript_Nestjs_Class Validator - Fatal编程技术网

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}`;
}
您还可以使用在一次调用中执行所有转换、验证和检查错误列表步骤:)要点:-)我不会改变我的答案,因为添加关于安装另一个软件包的注释会使它变得更长,但我认为这是一个非常有用的注释。