在 NestJS Redis 微服务中验证输入参数

Validate input parameters in NestJS Redis Microservice

在基于 Redis/TCP 的 NestJS 微服务中验证和转换参数的正确方法是什么。我知道我们可以在 HTTP 上为基于 API 的微服务使用管道和验证器。我应该与手动验证竞争吗?有相同的例子吗?

Pipes 仍在微服务中工作。您可以像通常为 HTTP 那样创建 DTO,并以相同的方式绑定 ValidatioinPipe

这是实现此目的的代码。感谢 Jay McDoniel

import { ArgumentsHost, Catch, ExceptionFilter, Logger } from "@nestjs/common";
import { RpcException } from '@nestjs/microservices';

@Catch(RpcException)
export class AWSImageOCRRequestFilter implements ExceptionFilter {
  private logger = new Logger('AWSImageOCRRequestFilter');

  catch(exception: RpcException, host: ArgumentsHost) {
    this.logger.log(exception.name, exception.message);
    return new RpcException(exception.getError());
  }
}

上面的过滤器进入控制器,以便在调用时启动

@UseFilters(new AWSImageOCRRequestFilter())
  @MessagePattern('awsimageocr')
  async textractForImage(
    @Payload(new ValidationPipe({ whitelist: true }))
    scorecardReq: ScorecardRequest,
  )

为了支持这个过滤器,我已经像下面的代码一样进行了 DTO 验证

export class ImageOCRRequest {
  @IsString()
  @IsNotEmpty()
  project: string;
  @IsString()
  @IsNotEmpty()
  file: string;
  @IsString()
  @IsNotEmpty()
  filename: string;
}

如果您缺少任何必需的参数,您将看到如下所示的异常

[Nest] 26692   - 03/23/2021, 5:11:20 PM   [RpcExceptionsHandler] Bad Request Exception +453863ms
Error: Bad Request Exception
    at ValidationPipe.exceptionFactory (/Users/XXXXXXX/Projects/Grange/Nest/nestimageservice/node_modules/@nestjs/common/pipes/validation.pipe.js:89:20)
    at ValidationPipe.transform (/Users/XXXXXXX/Projects/Grange/Nest/nestimageservice/node_modules/@nestjs/common/pipes/validation.pipe.js:65:30)
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
    at async resolveParamValue (/Users/XXXXXXX/Projects/Grange/Nest/nestimageservice/node_modules/@nestjs/microservices/context/rpc-context-creator.js:106:31)
    at async Promise.all (index 0)
    at async pipesFn (/Users/XXXXXXX/Projects/Grange/Nest/nestimageservice/node_modules/@nestjs/microservices/context/rpc-context-creator.js:108:13)
    at async /Users/XXXXXXX/Projects/Grange/Nest/nestimageservice/node_modules/@nestjs/microservices/context/rpc-context-creator.js:43:17
    at async /Users/XXXXXXX/Projects/Grange/Nest/nestimageservice/node_modules/@nestjs/microservices/context/rpc-proxy.js:11:32
    at async ServerRedis.handleEvent (/Users/XXXXXXX/Projects/Grange/Nest/nestimageservice/node_modules/@nestjs/microservices/server/server.js:63:32)