Как извлечь сообщение из channel.consume - PullRequest
0 голосов
/ 02 октября 2019

Я успешно получил сообщение от rabbitmq, я вижу сообщение, если добавляю console.log (msg), но проблема в том, что я не могу получить сообщение за пределами channel.consume

Iпопытался присвоить его переменной, но он все еще не работает

const connection = await amqp.connect("amqp://localhost")
const channel = await connection.createChannel()
const queue = 'data-portal-response'

var messageString;
channel.consume(queue, msg => {
    console.log('Checking message...');
    if (msg !== null) {
        messageString = msg.content.toString();
        console.log('Acknowledging message..');
        channel.ack(msg);
        console.log('Acknowledged.');
        return messageString;
    } else {
        console.log('No messages to consume.');
        return null;
    }
});


console.log(messageString);

Я ожидаю, что код напечатает messageString за пределами потребляемой части console.log (messageString);

1 Ответ

2 голосов
/ 02 октября 2019

С учетом следующего:

channel.consume(queue, msg => { ... });

Ваше ожидание, указанное ниже,

Я ожидаю, что код будет печатать messageString вне потребляемой части console.log (messageString);

- неудачное ожидание. Приведенный выше код выполняет обратный вызов в функции arrow для каждого полученного сообщения. Стрелка унаследует область от родительского контекста, но вы не можете пойти в другом направлении. Таким образом, происходят две вещи:

  1. Вызывается Consume и
  2. Строка 'undefined' регистрируется на вашей консоли. Это связано с тем, что следующая строка для запуска НЕ ​​находится внутри лямбда-выражения, а скорее является console.log(messageString), который в то время не определен.

Вместо этого вам необходимо переместить оператор console.log ВНУТРИфункция стрелки. Если вам нужна какая-то другая функция для запуска в родительской области (я полагаю, это то, что вам нужно), вам придется определить ее как отдельную функцию и вызвать ее из функции стрелки.

Например,:

let consumerTag = channel.consume(queue, msg => {
    console.log('Message received: ...');
    var messageString = msg.content.toString();
    this.doSomethingUsefulWith(messageString);

    console.log('Acknowledging message..');
    channel.ack(msg);
});

function doSomethingUsefulWith(messageString) { ... }
...