如何从 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 函数中对每条收到的消息执行回调。箭头将从父上下文继承范围,但您不能朝另一个方向走。因此,发生了两件事:
- Consume 被调用,并且
- 字符串 '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) { ... }
我成功消费了来自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 函数中对每条收到的消息执行回调。箭头将从父上下文继承范围,但您不能朝另一个方向走。因此,发生了两件事:
- Consume 被调用,并且
- 字符串 '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) { ... }