RabbitMQ amqp.node与nodejs express集成

时间:2017-01-07 13:11:33

标签: javascript node.js express rabbitmq amqp

官方RabbitMQ Javascript教程显示了amqp.node客户端库

的用法
amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var q = 'hello';

    ch.assertQueue(q, {durable: false});
    // Note: on Node 6 Buffer.from(msg) should be used
    ch.sendToQueue(q, new Buffer('Hello World!'));
    console.log(" [x] Sent 'Hello World!'");
  });
});

但是,我发现在其他地方重用此代码很困难。特别是,我不知道如何导出通道对象,因为它在回调中。例如,在我的NodeJs / Express App中:

app.post('/posts', (req, res) => {
    -- Create a new Post
    -- Publish a message saying that a new Post has been created
    -- Another 'newsfeed' server consume that message and update the newsfeed table
    // How do I reuse the channel 'ch' object from amqp.node here
});

你们对这个有什么指导吗?欢迎其他图书馆的建议(因为我刚开始,易用性是我认为最重要的)

2 个答案:

答案 0 :(得分:3)

amqp.node是一个低级API集,可以最小化从AMQP到Node.js的转换。它基本上是一个应该从更友好的API使用的驱动程序。

如果您想要DIY解决方案,请创建一个可以从模块导出的API,并管理该API文件中的连接,通道和其他对象。

但我不建议你自己做。把事情搞定是不容易的。

我建议使用像Rabbot(https://github.com/arobson/rabbot/)这样的库来为你处理这个问题。

我一直在使用Rabbot很长一段时间了,我真的很喜欢它的工作方式。它将AMQP的细节推到了一边,让我专注于我的应用程序的商业价值和我需要的消息模式,以构建特色。

答案 1 :(得分:0)

如评论中所述,您可以使用var onSubmit = function(token) { document.getElementById("form-signin").submit(); } 公开新创建的频道。当然,每次创建新通道时都会覆盖它,除非您想保留一个通道数组或其他一些数据结构。 假设这是在一个名为module.exports的脚本中:

channelCreator.js

在您可能想要使用"导出"的脚本中信道:

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var q = 'hello';

    ch.assertQueue(q, {durable: false});
    //this is where you can export the channel object
    module.exports.channel = ch;  
    //moved the sending-code to some 'external script'
  });
});

希望这有帮助。