我想在不同的节点模块中重用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
}
答案 0 :(得分:1)
您可以随时将频道句柄附加到global
对象,并且可以通过模块访问它:
#rabbitmq.js
global.ch = ch
#someController.js
global.ch # <- is the channel instance
我更愿意将句柄注入每个函数中,因为我认为它更明确,更容易推理和单元测试。你可以用部分功能应用程序
来做到这一点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导出一个获取频道的功能。一个频道可以是单身,所以只有一个实例。那么任何一个通道句柄的方法都会从方法中请求一个方法,这个方法不需要通过函数或全局传递通道。