【问题标题】:NestJS microservices error with "No matching message handler"NestJS 微服务错误,“没有匹配的消息处理程序”
【发布时间】:2021-11-17 18:46:14
【问题描述】:

我正在构建一个应用程序,其中的微服务通过 RabbitMQ(请求-响应模式)进行通信。
一切正常,但我仍然遇到错误“远程服务中没有定义匹配的消息处理程序。” -
当我发送 POST对于我的客户端应用程序,它应该简单地通过客户端(ClientProxy)发送带有数据的消息,并且消费者应用程序应该响应。这个功能实际上有效,但总是只用于第二次。我知道这听起来很奇怪,但是在我的第一个 POST 请求中,总是有来自客户端的错误,并且我的第二个 POST 请求都有效。然而,这个问题在我的整个应用程序中无处不在,因此特定的 POST 请求仅用于示例。

这是代码:

客户:

@Post('devices')
async pushDevices(
    @Body(new ParseArrayPipe({ items: DeviceDto }))
    devices: DeviceDto[]
    ) {
    this.logger.log('Devices received'); 
    return this.client.send(NEW_DEVICES_RECEIVED, devices)
}

消费者:

 @MessagePattern(NEW_DEVICES_RECEIVED)
 async pushDevices(@Payload() devices: any, @Ctx() context: RmqContext) {
    console.log('RECEIVED DEVICES');
    console.log(devices);
    const channel = context.getChannelRef();
    const originalMsg = context.getMessage();
    channel.ack(originalMsg);
    return 'ANSWER';
  }

客户端有 RMQ 设置 queueOptions: {durable: true} 和消费者以及 queueOptions: {durable: true}noAck: false

请问您有什么想法可能导致问题吗?我尝试使用 JSON.stringify 发送数据并将消息结构更改为 {data: devices} 但错误仍然存​​在。

【问题讨论】:

    标签: docker rabbitmq microservices nestjs


    【解决方案1】:

    我在不使用 RabbitMQ 时遇到了这个错误。除了与 RabbitMQ 相关之外,我在网上找到的有关此错误消息的帮助很少。

    对我来说,这是我从微服务控制器中的另一个微服务导入 DTO 的问题。我的微服务中有一个新的 DTO,其名称与另一个微服务中的 DTO 相似。我不小心从自动列表中选错了。

    由于没有任何真正的迹象表明我的构建不好,只有这个错误,我想分享一下,以防其他人犯我犯的同样错误。

    【讨论】:

      【解决方案2】:

      我今天遇到了同样的问题,在网上找不到任何解决方案,偶然发现了你的问题。我以一种 hacky 的方式解决了它,但不确定当应用程序扩展时它会如何表现。

      我基本上在生产者微服务本身的控制器中添加了一个@EventPattern(在您的情况下为@MessagePattern)。我调用了 client.emit() 函数两次。

      所以基本上第一次它被生产者本身的函数消耗,第二次发出实际上是实际的消费者。 这样,只需一个 POST 调用就足够了。

      生产者控制器:

      @EventPattern('video-uploaded')
        async test() {
          return 1;
        }

      生产者客户端:

      async publishEvent(data: VideosDto) {
          this.client.emit('video-uploaded', data);
          this.client.emit('video-uploaded', data);
      }

      【讨论】:

        猜你喜欢
        • 2022-12-09
        • 2022-06-15
        • 2021-09-28
        • 1970-01-01
        • 2019-12-31
        • 2020-10-20
        • 1970-01-01
        • 2022-11-30
        • 2020-03-09
        相关资源
        最近更新 更多