我有一个微服务应用程序,一个API网关和一个服务。RabbitMQ
用作消息代理。我意识到,在服务中,你需要使用RpcException
和message和statusCode,而不是HttpException
。但是我在使用ValidationPipe
时遇到了困难,在DTO
中验证数据时,我从API gateway获得了500个statusCode
。因为在引擎盖下,它抛出一个BadRequestException
。老实说,我不明白我需要做什么来将这个异常转换为rpc格式,或者我需要做一些其他的事情。也许需要某种exceptionFilter
,但我不知道如何做到这一点。
API网关
@Controller()
export class ApiGateway {
constructor(
@Inject('AUTH_SERVICE') private authService: ClientProxy,
) {}
@Post('auth/register')
async register(
@Body('email') email: string,
@Body('password') password: string | number,
) {
return this.authService.send({ cmd: 'register' }, { email, password });
}
}
字符串
main.ts auth
async function bootstrap() {
const app = await NestFactory.create(AuthModule);
const configService = app.get(ConfigService);
const rmqService = app.get(RmqService);
const queue = configService.get('RABBITMQ_AUTH_QUEUE');
app.connectMicroservice(rmqService.getOptions(queue));
await app.startAllMicroservices();
}
bootstrap();
型
授权控制器
@Controller()
export class AuthController {
constructor(
private readonly authService: AuthService,
private readonly rmqService: RmqService,
) {}
@MessagePattern({ cmd: 'register' })
async register(@Ctx() ctx: RmqContext, @Payload() newUser: UserDto) {
this.rmqService.acknowledgeMessage(ctx);
return this.authService.register(newUser);
}
}
型
UserDto
@UsePipes(new ValidationPipe({ whitelist: true }))
export class UserDto {
@IsEmail()
email: string;
@IsString()
@IsNotEmpty()
password: string;
}
型
1条答案
按热度按时间kd3sttzy1#
我设法用
RpcException
覆盖了HttpException
。我还重新定义了我将接收验证错误消息的表单,也许它会对某人有用