复用回调参数/复用通道
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 导出函数以获取频道。一个通道可以是一个单例,所以它永远只有一个实例。然后任何有通道句柄的方法都会从该方法请求一个通道句柄,这不需要通过函数或全局传递通道。
我想在不同的节点模块中重用 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 导出函数以获取频道。一个通道可以是一个单例,所以它永远只有一个实例。然后任何有通道句柄的方法都会从该方法请求一个通道句柄,这不需要通过函数或全局传递通道。