NEst RabbitMQ RPC nack不拒绝承诺

swvgeqrz  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(174)

通过nestJS rabbit MQ,我使用RPC从一个服务器到另一个服务器。我基本上想要的是当消费者抛出错误时await this.amqpConnection.request拒绝承诺。正如我从thisthis以及本文档中所理解的,当您NACK(否定确认)消息,它应该将RPC响应放入相应的队列,并将错误信息传递给客户端。下面是一些代码示例:

制作者

import { AmqpConnection } from '@golevelup/nestjs-rabbitmq';

let amqpConnection: AmqpConnection;

sendMessage(payload: any) {
  try {
      const result = await this.amqpConnection.request({
        exchange: 'user',
        routingKey: 'test',
        queue: 'test',
        payload,
      });
      console.log(result);
  } catch (e) {
      console.error(e); // I expect this flow !!! 
  }
}

消费者

@RabbitRPC({
    exchange: 'user',
    routingKey: 'test',
    queue: 'test',
    errorBehavior: MessageHandlerErrorBehavior.NACK
  })
  public async rpcHandler(payload: any): Promise<any> {
     throw Error("Error text that should be proxied to console.error"):
  }

但是消息甚至没有返回到客户端。客户端在超时后被拒绝,而不是因为消费者处理过程中的错误。如果我的理解不正确,我想知道nestjs是否有一个内置的机制来拒绝消息,而不需要手动创建一些错误的响应类型并在客户端处理它。

z31licg0

z31licg01#

您应该完全从@nestjs/microservices抛出RpcException,并且只使用特定的参数

throw new RpcException({
   code: 42, // some number code
   message: 'wait. oh sh...', // some string value
});

同样,如果您使用自定义异常过滤器,则它应该从@nestjs/microservices扩展BaseRpcExceptionFilter。在ArgumentsHost上调用getType()方法,如果其结果等于'rpc',则使用super.catch方法。

相关问题