DTO 不适用于微服务,而是直接适用于 api

Muh*_*ras 3 microservices class-validator nestjs

我正在 NestJS 中开发 api 和微服务,这是我的控制器功能

    @Post()
    @MessagePattern({ service: TRANSACTION_SERVICE, msg: 'create' })
    create( @Body() createTransactionDto: TransactionDto_create ) : Promise<Transaction>{
        return this.transactionsService.create(createTransactionDto)
    }
Run Code Online (Sandbox Code Playgroud)

当我调用 post api 时,dto 验证工作正常,但是当我使用微服务调用此验证时,验证不起作用,它会传递到服务而不会因错误而拒绝。这是我的 DTO

import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
export class TransactionDto_create{
    @IsNotEmpty()
    action: string;

    // @IsString()
    readonly rec_id : string;

    @IsNotEmpty()
    readonly data : Object;

    extras : Object;
    // readonly extras2 : Object;
}
Run Code Online (Sandbox Code Playgroud)

当我调用没有操作参数的 api 时,它会显示所需的错误操作,但是当我使用微服务调用它时

const 模式 = { 服务: TRANSACTION_SERVICE, msg: '创建' }; const data = {id: '5d1de5d787db5151903c80b9', extras:{'asdf':'dsf'}};

return this.client.send<number>(pattern, data)
Run Code Online (Sandbox Code Playgroud)

它不会抛出错误并进入服务状态。我还添加了全局管道验证。

app.useGlobalPipes(new ValidationPipe({
    disableErrorMessages: false,  // set true to hide detailed error message
    whitelist: false,  // set true to strip params which are not in DTO
    transform: false // set true if you want DTO to convert params to DTO class by default its false
  }));
Run Code Online (Sandbox Code Playgroud)

它如何适用于 api 和微服务,因为我需要将所有内容集中在一处并具有相同的功能,以便根据客户端可以调用它。

小智 9

ValidationPipe 抛出 HTTP BadRequestException,而代理客户端期望的是 RpcException。

@Catch(HttpException)
export class RpcValidationFilter implements ExceptionFilter {
    catch(exception: HttpException, host: ArgumentsHost) {
        return new RpcException(exception.getResponse())
    }
}
Run Code Online (Sandbox Code Playgroud)
@UseFilters(new RpcValidationFilter())
@MessagePattern('validate')
async validate(
    @Payload(new ValidationPipe({ whitelist: true })) payload: SomeDTO,
) {
    // payload validates to SomeDto 
    . . .
}
Run Code Online (Sandbox Code Playgroud)