docker - 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} 但错误仍然存在。
解决方案
我在不使用 RabbitMQ 时遇到了这个错误。除了与 RabbitMQ 相关之外,我在网上发现的有关此错误消息的帮助很少。
对我来说,这是我从微服务控制器中的另一个微服务导入 DTO 的问题。我的微服务中有一个新的 DTO,其名称与另一个微服务中的 DTO 相似。我不小心从自动列表中选择了错误的一个。
由于没有任何真正的指标表明我的构建不好,只有这个错误,我想分享一下,以防其他人犯我犯的同样错误。
推荐阅读
- php - Sendinblue 附件
- amazon-web-services - 从公有弹性集群迁移到 VPC 集群
- javascript - 谷歌翻译小部件延迟显示在网页上
- amazon-s3 - 将名称包含斜杠的文件上传到 AWS S3 存储桶
- sql - 如何插入多个insert sql语句
- kotlin - 如何在 Kotlin Multiplatform 中将默认的 `jvm` sourceSet 添加到 `android` 目标?
- swift - 如何获取已编辑的 NSOutlineView 文本字段单元格的“项目”或行索引?
- python - 避免数据帧 groupby 结果变成系列
- youtube-iframe-api - 如何在 youtube api 嵌入代码中删除更多视频 div
- php - dropzone 传递空文件名