复用回调参数/复用通道

Reuse parameter of callback / Reuse channel

我想在不同的节点模块中重用 RabbitMQ 通道。由于通道是异步创建的,我不确定将此通道对象 "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
}

您始终可以将频道句柄附加到 global 对象,并且可以跨模块访问它:

// rabbitmq.js
    
global.ch = ch
    
// someController.js
    
global.ch // <- is the channel instance 

我更愿意将句柄注入每个函数,因为我认为它更明确,更容易推理和单元测试。您可以使用部分函数 application

来做到这一点

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 导出函数以获取频道。一个通道可以是一个单例,所以它永远只有一个实例。然后任何有通道句柄的方法都会从该方法请求一个通道句柄,这不需要通过函数或全局传递通道。