在 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)
在基于 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)