首页 > 解决方案 > NestJS 微服务错误,“没有匹配的消息处理程序”

问题描述

我正在构建一个应用程序,其中的微服务通过 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';
  }

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

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

标签: dockerrabbitmqmicroservicesnestjs

解决方案


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

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

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


推荐阅读