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: true 和 noAck: 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 微服务错误,“没有匹配的消息处理程序”的主要内容,如果未能解决你的问题,请参考以下文章