Search code examples
javascriptrabbitmqmicroservicesnestjs

how to use RabbitMQ and REST-API in Nest App?


Good Day!

I'm trying to implement 2 microservices that communicate with each other through a message broker. But one of them should accept Http requests via REST-Api. Unfortunately, I don't understand how to make the microservice listen to both the message queue and incoming HTTP requests. Perhaps I don’t understand something in the paradigm of communication through a message broker, but how then to receive requests from the client and forward them to the microservice architecture?

Main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import {Transport, MicroserviceOptions} from '@nestjs/microservices'

async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
    transport: Transport.RMQ,
    options: {
      urls: ['amqp://rabbitmq:5672'],
      queue: 'hello_world',
      queueOptions: {
        durable: false
      },
    },
  });
  await app.listen();
}
bootstrap();

As you can see, now the application is not listening on port 3000 as in the standard approach. What should be done?


Solution

  • The answer turned out to be quite simple. NEST js has hybrid apps. You can get to know them here https://docs.nestjs.com/faq/hybrid-application#hybrid-application. Thanks everyone

    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    import {Transport, MicroserviceOptions} from '@nestjs/microservices'
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
    
      const microservice = app.connectMicroservice({
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://rabbitmq:5672'],
          queue: 'hello_world',
          queueOptions: {
            durable: false
          },
        },
      });
    
      await app.startAllMicroservices();
      await app.listen(3000);
    }
    bootstrap();