重用回调/重用通道的参数

时间:2015-09-23 14:42:05

标签: javascript node.js architecture rabbitmq amqp

我想在不同的节点模块中重用RabbitMQ通道。由于频道是异步创建的,我不确定最好的方法是什么?#34; inject"这个频道对象是其他模块。

如果可能的话,我想避免像DI容器这样的外部依赖。

下面,您会找到我的简化代码。

提前感谢您的任何建议。

web.js

require('./rabbitmq')(function (err, conn) {
    ...

    // Start web server
    var http = require('./http');
    var serverInstance = http.listen(process.env.PORT || 8000, function () {
        var host = serverInstance.address().address;
        var port = serverInstance.address().port;

    });
});

rabbitmq.js

module.exports = function (done) {
    ...

    amqp.connect(rabbitMQUri, function (err, conn) {
       ...

        conn.createChannel(function(err, ch) {
            ...
            // I would like to reuse ch in other modules
        });
    });
}

someController.js

module.exports.post = function (req, res) {
   // Reuse/inject "ch" here, so I can send messages
}

1 个答案:

答案 0 :(得分:1)

您可以随时将频道句柄附加到global对象,并且可以通过模块访问它:

#rabbitmq.js

global.ch = ch

#someController.js

global.ch # <- is the channel instance 

我更愿意将句柄注入每个函数中,因为我认为它更明确,更容易推理和单元测试。你可以用部分功能应用程序

来做到这一点

lodash

var post = function (req, res, rabbitMQchannel) {
   // Reuse/inject "ch" here, so I can send messages
}

var ch = getYourChannel();

# post is function object that accepts two params, and the
# third is bound to your channel

module.exports.post = _.partialRight(post, ch);

第三个选项是让rabbitmq.js导出一个获取频道的功能。一个频道可以是单身,所以只有一个实例。那么任何一个通道句柄的方法都会从方法中请求一个方法,这个方法不需要通过函数或全局传递通道。