为什么带有amqplib消费功能的nodejs是闭包的?
Why the nodejs with amqplib consume function is closure?
我使用nodejs amqplib模块连接rabbitmq。
我发现消费函数变成了闭包函数,但我不明白为什么。我没有使用闭包。
我的代码如下。我发现 returnOK 中的 corr 仍然得到第一次值。当我第二次触发这个功能时。 corr 仍然是第一次的值。
我认为这很奇怪。有人可以解释一下吗?
const corr = new Date().getTime();
try {
const params = JSON.stringify(req.body);
console.log('corr first =', corr);
await ch.sendToQueue(q, Buffer.from(params), {
deliveryMode: true,
correlationId: corr.toString(),
replyTo: queue.queue,
});
const returnOK = (msg) => {
if (msg.properties.correlationId === corr.toString()) {
console.info('******* Proxy send message done *******');
res.status(HTTPStatus.OK).json('Done');
}
};
await ch.consume(queue.queue, returnOK, { noAck: true });
} catch (error) {
res.status(HTTPStatus.INTERNAL_SERVER_ERROR).json(error);
}
您似乎对每个请求都调用了 ch.consume
,实际上每次都创建了一个新的消费者。你应该只做一次。
发生的情况是第一个消费者正在接收消息。
要解决此问题,您可能需要将 ch.consume
移到请求处理程序之外。
我使用nodejs amqplib模块连接rabbitmq。 我发现消费函数变成了闭包函数,但我不明白为什么。我没有使用闭包。
我的代码如下。我发现 returnOK 中的 corr 仍然得到第一次值。当我第二次触发这个功能时。 corr 仍然是第一次的值。 我认为这很奇怪。有人可以解释一下吗?
const corr = new Date().getTime();
try {
const params = JSON.stringify(req.body);
console.log('corr first =', corr);
await ch.sendToQueue(q, Buffer.from(params), {
deliveryMode: true,
correlationId: corr.toString(),
replyTo: queue.queue,
});
const returnOK = (msg) => {
if (msg.properties.correlationId === corr.toString()) {
console.info('******* Proxy send message done *******');
res.status(HTTPStatus.OK).json('Done');
}
};
await ch.consume(queue.queue, returnOK, { noAck: true });
} catch (error) {
res.status(HTTPStatus.INTERNAL_SERVER_ERROR).json(error);
}
您似乎对每个请求都调用了 ch.consume
,实际上每次都创建了一个新的消费者。你应该只做一次。
发生的情况是第一个消费者正在接收消息。
要解决此问题,您可能需要将 ch.consume
移到请求处理程序之外。