NestJS 微服务错误,“没有匹配的消息处理程序”

Posted

技术标签:

【中文标题】NestJS 微服务错误,“没有匹配的消息处理程序”【英文标题】:NestJS microservices error with "No matching message handler" 【发布时间】: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: truenoAck: false 请问您有什么想法可能导致问题吗?我尝试使用 JSON.stringify 发送数据并将消息结构更改为 data: devices 但错误仍然存​​在。

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于NestJS 微服务错误,“没有匹配的消息处理程序”的主要内容,如果未能解决你的问题,请参考以下文章

NestJS 微服务和云部署

NestJS - 在微服务中结合 HTTP 和 RabbitMQ

如何使用nestjs redis 微服务?

在 NestJS 微服务中公开普通的 http 端点

NestJS:有没有办法从外部调用微服务rabbitmq

NestJS - 文件上传到微服务