javascript 在Nest.js中使用自定义管道访问多个参数

c0vxltue  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(153)

我尝试编写一个自定义验证管道来验证一个带有多个参数的请求。我想用自定义管道验证一个参数,但另一个参数也需要在验证中使用,我没有找到文档中描述的方法。
例如,这是我的API,它需要一个chainId和一个address作为输入参数。我需要验证地址是否有效,但没有chainId我无法做到这一点。
下面是我的代码,我写的管道后面是关于自定义管道的文档例子:
控制器

@Put('/:chainId/tokens/:address')
@ApiOperation({
  summary: 'Create a token',
})
async create(
  @Param('chainId') chainId: number,
  @Param('address', new AddressValidationPipe()) address: string,
): Promise<Token> {
  return await this.tokensService.save(chainId, address);
}

验证管

@Injectable()
export class AddressValidationPipe implements PipeTransform {
  async transform(address: string) {
    // chainId should be another param, but I don't know how to get it in this pipe
    const chainId = 4;

    if (!validator(chainId, address)) {
      throw new BadRequestException(
        'Address is not valid, or it is not on this chain',
      );
    }
    return address;
  }
}
vlurs2pr

vlurs2pr1#

经过一些研究,我发现我可以一次将这两个参数放入这个管道,并且只验证地址。
验证管道

@Injectable()
export class AddressValidationPipe implements PipeTransform {
  constructor(private readonly configService: ConfigService) {}
  async transform(value: { chainId: string; address: string }) {
    const { chainId, address } = value;

    if (!validator(Number(chainId), address)) {
      throw new BadRequestException(
        'Address is not valid, or it is not on this chain',
      );
    }

    return { chainId: Number(chainId), address };
  }
}

尽管如此,我必须自己将chainId转换为数字,并且我需要告诉Swagger我使用的参数,因为我没有将它们作为控制器中的每个参数编写。
控制器

@ApiParam({
  name: 'address',
  description: 'Address of the token',
  type: String,
})
@ApiParam({
  name: 'chainId',
  description: 'Chain ID of the token',
  type: Number,
})
@Put('/:chainId/tokens/:address')
@ApiOperation({
  summary: 'Create a token',
})
async create(
  @Param(AddressValidationPipe) param: { chainId: number; address: string },
): Promise<Token> {
  const { chainId, address } = param;
  return await this.tokensService.save(chainId, address);
}

相关问题