首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RabbitMQ/ Krakend /NestJS -如何通过Krakend的异步代理发布所使用的消息?

RabbitMQ/ Krakend /NestJS -如何通过Krakend的异步代理发布所使用的消息?
EN

Stack Overflow用户
提问于 2022-08-29 09:08:52
回答 1查看 148关注 0票数 1

这是我的krakend.json配置

代码语言:javascript
复制
  "async_agent": [
    {
      "name": "test-agent",
      "connection": {
        "max_retries": 10,
        "backoff_strategy": "exponential-jitter"
      },
      "consumer": {
        "topic": "krakend",
        "workers": 5
      },
      "backend": [
        {
          "url_pattern": "/greeted",
          "method": "POST",
          "host": [ "http://127.0.0.1:2999" ],
          "disable_host_sanitize": false
        }
      ],
      "extra_config": {
        "async/amqp": {
          "host": "amqp://guest:guest@localhost:5672/",
          "name": "krakend",
          "exchange": "ApiGatewayExchange",
          "durable": true,
          "delete": false,
          "exclusive": false,
          "no_wait": false,
          "auto_ack": false
        }
      }
    }
  ]

消息是从服务发送的,类似的情况如下:

代码语言:javascript
复制
export class AppService {
  constructor(@Inject('GREETING_SERVICE') private client: ClientProxy){}

  getHello(): ResponseDTO {
    const responseDTO: ResponseDTO = {
      action: 'Hello',
      service: 'from service A'
    }
    this.client.emit('', responseDTO);
    return responseDTO;
  }
}

并导入GREETING_SERVICE配置如下:

代码语言:javascript
复制
  imports: [
    ClientsModule.register([
      {
        name: 'GREETING_SERVICE',
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://test:test@localhost:5672/'],
          queue: 'krakend'
        }
      }
    ])
  ],

最后,这是另一个服务中的端点(让我们调用这个服务-c),它从使用者那里获取消息:

代码语言:javascript
复制
  @Post('greeted')
  TestHello(@Body() data: any) {
    console.log(data)
    return data
  }

该消息成功地作为async_agent在我的krakend文件中设置的设置使用,但该消息没有作为主体提交到该端点。当我对应该传递的数据做一个console.log时,它只会打印{}

我在这里做错什么了吗?挠了我几个小时的头。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-01 07:03:46

您的krakend.json配置的异步部分在我看来不错,但我怀疑您可能遇到的问题。

如今,大多数javascript框架都要求您传递特定的标题,以发挥它们的魔力,如Content-TypeAccept。您必须考虑到,KrakenD将向您的NestJS应用程序传递一组非常精简的标头(据我所知,Accept-EncodingUser-Agent )。

我不熟悉NestJS,但我敢打赌,你需要通过Content-Type,而且你很好。下面是我对配置的建议:

代码语言:javascript
复制
    "async_agent": [
        {
            "name": "test-agent",
            "connection": {
                "max_retries": 10,
                "backoff_strategy": "exponential-jitter"
            },
            "consumer": {
                "topic": "krakend",
                "workers": 5
            },
            "backend": [
                {
                    "url_pattern": "/greeted",
                    "method": "POST",
                    "host": [
                        "http://127.0.0.1:2999"
                    ],
                    "disable_host_sanitize": false,
                    "extra_config": {
                        "modifier/martian": {
                            "header.Modifier": {
                                "scope": [
                                    "request"
                                ],
                                "name": "Content-Type",
                                "value": "application/json"
                            }
                        }
                    }
                }
            ],
            "extra_config": {
                "async/amqp": {
                    "host": "amqp://guest:guest@localhost:5672/",
                    "name": "krakend",
                    "exchange": "ApiGatewayExchange",
                    "durable": true,
                    "delete": false,
                    "exclusive": false,
                    "no_wait": false,
                    "auto_ack": false
                }
            }
        }
    ]
}

希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73526505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档