rabbitmq nestjs上微服务中的异常

dsekswqp  于 2023-08-05  发布在  RabbitMQ
关注(0)|答案(1)|浏览(145)

我有一个微服务应用程序,一个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;
}

kd3sttzy

kd3sttzy1#

我设法用RpcException覆盖了HttpException。我还重新定义了我将接收验证错误消息的表单,也许它会对某人有用

export const VALIDATION_PIPE_OPTIONS = {
  transform: true,
  whitelist: true,
  exceptionFactory: (errors) => {
    return new RpcException({
      message: validationErrorsConversion(errors),
      statusCode: 400,
    });
  },
};
export function validationErrorsConversion(arr) {
  const result = [];

  arr.forEach((obj) => {
    const { property, constraints } = obj;
    const values = Object.keys(constraints).map(
      (key) => VALIDATION_ERRORS_CONST[key] || constraints[key],
    );

    result.push({
      [property]: values,
    });
  });

  return result;
}
export const VALIDATION_ERRORS_CONST = {
  isEmail: 'Is not email',
  isString: 'It should be a string',
};

相关问题