如何从 channel.consume 中提取信息

How to extract msg from channel.consume

我成功消费了来自rabbitmq的消息,如果我添加console.log(msg)我可以看到消息,但问题是我无法在channel.consume[之外获取消息=12=]

我尝试将其赋值给变量,但还是不行

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);

鉴于以下情况:

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

您的期望,如下所述,

I'm expecting the code to print messageString outside the consume part console.log(messageString);

是一个不幸的期望。您上面的代码在 arrow 函数中对每条收到的消息执行回调。箭头将从父上下文继承范围,但您不能朝另一个方向走。因此,发生了两件事:

  1. Consume 被调用,并且
  2. 字符串 'undefined' 已记录到您的控制台。那是因为 运行 的下一行不在 lambda 内部,而是当时未定义的 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) { ... }