Microservices DTO不适用于微服务,但直接适用于API
我正在用nestJS开发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
@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
. . .
}