Node / RabbitMQ - Отправить ответ потребителя на маршрут nodejs - PullRequest
0 голосов
/ 21 февраля 2020

Я обрабатываю nodejs запросы через RabbitMQ. Мой производитель получает запросы по маршруту nodejs и отправляет их потребителю, который затем создает документ в БД на основе данных, полученных из запроса. Вот мой маршрут

router.post("/create-user", async(req: Request, res: Response) => {
  const msg = JSON.stringify(req.body);
  const send = await Producer(msg);
});

Вот мой класс продюсера

import amqp from "amqplib/callback_api";

export async function Producer(message: string) {
  amqp.connect("amqp://localhost", (error0, connection) => {
    if (error0) {
      throw error0;
    }
    connection.createChannel((error1, channel) => {
      if (error1) {
        throw error1;
      }

      let queue = "hello";

      channel.assertQueue(queue, {
        durable: false,
      });
      channel.sendToQueue(queue, Buffer.from(message));
      console.log(" [x] Sent %s", message);
    });
  });
}

И мой потребитель

import amqp from "amqplib/callback_api";
import {
  User
} from "../models/user";

export class ConsumerClass {
  public async ConsumerConnection() {
    amqp.connect("amqp://localhost", (error0, connection) => {
      if (error0) {
        throw error0;
      } else {
        this.ConsumerTask(connection);
      }
    });
  }

  public async ConsumerTask(connection: amqp.Connection) {
    connection.createChannel((error1, channel) => {
      if (error1) {
        throw error1;
      }

      let queue = "hello";

      channel.assertQueue(queue, {
        durable: false,
      });

      channel.prefetch(1);

      console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", queue);

      channel.consume(queue, async(msg) => {
        console.log(" [x] Received %s", msg.content.toString());
        const data = JSON.parse(msg.content.toString());
        const user = new User({
          name: data.name,
          phone: data.phone,
          company: data.company,
        });
        await user.save();
      }, {
        noAck: true,
      });
    });
  }
}

Я хочу отправить документ Json пользователя, созданного из потребителя, на маршрут, чтобы клиент мог получить созданного пользователя в ответ. Как мне этого добиться и что я делаю не так?

1 Ответ

0 голосов
/ 21 февраля 2020

То, что вы хотите - это ответное событие от потребителя к производителю. Теперь здесь вы можете создать функцию, которая будет выполнять функцию удаленного вызова процедуры.

Таким образом, вместо двух событий будет 2 события e1 и e2. Вот небольшая диаграмма, чтобы объяснить это (отказ от ответственности - я плохо рисую). Я думаю, что вы можете управлять частью кодирования этого.

enter image description here

...