Microservices DTO不适用于微服务,但直接适用于API

Microservices DTO不适用于微服务,但直接适用于API,microservices,nestjs,class-validator,Microservices,Nestjs,Class Validator,我正在用nestJS开发API和微服务, 这是我的控制器功能 @Post() @MessagePattern({ service: TRANSACTION_SERVICE, msg: 'create' }) create( @Body() createTransactionDto: TransactionDto_create ) : Promise<Transaction>{ return this.transactionsService.cr

我正在用nestJS开发API和微服务, 这是我的控制器功能

    @Post()
    @MessagePattern({ service: TRANSACTION_SERVICE, msg: 'create' })
    create( @Body() createTransactionDto: TransactionDto_create ) : Promise<Transaction>{
        return this.transactionsService.create(createTransactionDto)
    }
当我在没有动作参数的情况下调用api时,它会显示错误动作,但当我使用

const pattern={service:TRANSACTION_service,msg:'create'}; const data={id:'5d1de5d787db5151903c80b9',附加:{'asdf':'dsf'}

return this.client.send<number>(pattern, data)

它将如何在api和微服务中工作,因为我需要所有的东西都在一个地方,并且具有相同的功能,以便根据客户机调用它。

我要冒险,假设你
main.ts
有一行
app.useGlobalPipes(new ValidationPipe())

在混合应用程序的情况下,
useGlobalPipes()
方法不会为网关和微服务设置管道。对于“标准”(非混合)微服务应用程序,
useGlobalPipes()
会全局安装管道

您可以从
AppModule
全局绑定管道,也可以在需要通过
ValidationPipe
验证的每个路由上使用
@usepippes()
装饰器


我要冒险,假设你
main.ts
有一行
app.useGlobalPipes(new ValidationPipe())

在混合应用程序的情况下,
useGlobalPipes()
方法不会为网关和微服务设置管道。对于“标准”(非混合)微服务应用程序,
useGlobalPipes()
会全局安装管道

您可以从
AppModule
全局绑定管道,也可以在需要通过
ValidationPipe
验证的每个路由上使用
@usepippes()
装饰器


ValidationPipe抛出HTTP BadRequestException,其中代理客户端需要rpceException

@Catch(HttpException)
export class RpcValidationFilter implements ExceptionFilter {
    catch(exception: HttpException, host: ArgumentsHost) {
        return new RpcException(exception.getResponse())
    }
}

ValidationPipe抛出HTTP BadRequestException,其中代理客户端期望RPCEException

@Catch(HttpException)
export class RpcValidationFilter implements ExceptionFilter {
    catch(exception: HttpException, host: ArgumentsHost) {
        return new RpcException(exception.getResponse())
    }
}

我试过这个,但问题是,即使验证有效,它也只给出内部服务错误是对microservice的响应,它显示服务中的完全错误,但在我调用的服务上,它只显示内部服务器错误响应。就像我从服务B调用srevice A的函数一样,在服务A上它显示完全错误,比如验证失败,但在服务B上它只显示内部服务器错误。我也需要完整的错误,以便在该服务客户端上现在应该知道错误是什么。这听起来像是一个传播错误的问题,在您的情况下,从服务A返回到服务B。我建议设置一些
过滤器来帮助此功能。我解决了这个问题,问题是,验证管道抛出异常对象,当直接使用api时,它工作得很好,但是microservice客户端的构建方式是,如果错误对象的类型是RpcException,它只接受整个错误对象,我刚刚添加了扩展到验证管道的自定义验证管道,并将exceptino更改为rpceException,现在它可以工作了。@muhammadadilbanaras方法可以工作,但它将花费所有类验证程序功能。我建议自定义筛选器捕获HttpException并抛出RpcException。我尝试了这个方法,但问题是,即使验证有效,它也只会给出内部服务错误,即对microservice的响应,它在服务中显示完全错误,但在我调用的服务中,它只显示内部服务器错误响应。就像我从服务B调用srevice A的函数一样,在服务A上它显示完全错误,比如验证失败,但在服务B上它只显示内部服务器错误。我也需要完整的错误,以便在该服务客户端上现在应该知道错误是什么。这听起来像是一个传播错误的问题,在您的情况下,从服务A返回到服务B。我建议设置一些
过滤器来帮助此功能。我解决了这个问题,问题是,验证管道抛出异常对象,当直接使用api时,它工作得很好,但是microservice客户端的构建方式是,如果错误对象的类型是RpcException,它只接受整个错误对象,我刚刚添加了扩展到验证管道的自定义验证管道,并将exceptino更改为rpceException,现在它可以工作了。@muhammadadilbanaras方法可以工作,但它将花费所有类验证程序功能。我建议自定义筛选器捕获HttpException并抛出rpceException。rpc可以在正文中正确传递响应,但http状态代码未更新此解决方案运行良好。rpc可以在正文中正确传递响应,但http状态代码未更新此解决方案运行良好。
@Catch(HttpException)
export class RpcValidationFilter implements ExceptionFilter {
    catch(exception: HttpException, host: ArgumentsHost) {
        return new RpcException(exception.getResponse())
    }
}
@UseFilters(new RpcValidationFilter())
@MessagePattern('validate')
async validate(
    @Payload(new ValidationPipe({ whitelist: true })) payload: SomeDTO,
) {
    // payload validates to SomeDto 
    . . .
}