Javascript 节点简单对象工厂模块
所以我有一个节点应用程序,它利用了。我想将所有MQTT客户机创建逻辑封装在一个地方,以简化重构。我写了一个模版,如下所示:Javascript 节点简单对象工厂模块,javascript,node.js,factory,mqtt,Javascript,Node.js,Factory,Mqtt,所以我有一个节点应用程序,它利用了。我想将所有MQTT客户机创建逻辑封装在一个地方,以简化重构。我写了一个模版,如下所示: var mqtt = require('mqtt') , host = 'localhost' , port = '1883'; var settings = { keepalive: 30000, protocolId: 'MQIsdp', protocolVersion: 3, username:'testuser', pass
var mqtt = require('mqtt')
, host = 'localhost'
, port = '1883';
var settings = {
keepalive: 30000,
protocolId: 'MQIsdp',
protocolVersion: 3,
username:'testuser',
password:'testpass'
}
exports.createClient = function(clientId){
if(clientId){
settings.clientId = clientId;
}//otherwise default
return mqtt.createClient(port, host, settings);
}
我对node非常陌生,我会说我有中级javascript编程技能。无论出于什么原因,每当我在创建多个客户端时运行这段代码时,所有的麻烦都会爆发出来。他们玩得不好,互相踢对方
但是,如果我将完全相同的代码直接放在每个文件中,就没有问题了。团队中一位经验丰富的节点开发人员说,这可能与节点缓存用户模块的方式有关?只要多次调用create client,代码实际上不会返回新的客户端实例
我如何重写这个简单的工厂以正确运行
// requires up here
module.exports = function (options) {
var settings = {
keepalive: options.keepalive,
protocolId: options.protocolId,
protocolVersion: options.protocolVersion,
username: options.username,
password: options.password
};
return {
createClient: function (clientID) {
// your client creation code
},
otherMethod: function () {...}
}
}
看看这一切是怎么结束的?当您需要此模块时,您将获得一个函数(当然仍然是一个对象),例如:
var yourMod = require('./yourMod') ({
keepalive: 30000,
protocolId: 'MQIsdp',
protocolVersion: 3,
username:'testuser',
password:'testpass'
});
var cliendID = yourMod.createClient ( 23 );
我认为这应该行得通。我有一个跟踪模块,有3个不同的应用程序使用,它们都连接到不同的数据库。这是我使用的基本模块布局。事实上,它在javascript中被称为模块模式
编辑:修复了已解决问题。问题在于您共享
设置,但也会在每次通话中修改设置。这有助于:
var mqtt = require('mqtt')
, host = 'localhost'
, port = '1883';
exports.createClient = function(clientId){
var settings = {
keepalive: 30000,
protocolId: 'MQIsdp',
protocolVersion: 3,
username:'testuser',
password:'testpass'
}
if(clientId){
settings.clientId = deviceId + '-' + clientId;
}
return mqtt.createClient(port, host, settings);
}
此外,您还需要从参数或其他不起作用的合法位置获取设备ID。首先,输入错误-export
,其次是var youMod=require('./yourMod')()代码>而不是你所拥有的。打字错误是明显的,第二个是不好的,不管怎样,修正了。是的,很酷。另外,如果您执行var yourMod=require('./yourMod')();var one=yourMod.createClient(1);var two=yourMod.createClient(2)
问题仍然存在是的,他解决了。但是,在节点中工作时,了解模块模式仍然很好。deviceId
来自何处?我们是否应该克隆设置变量,如何使用单端口调用createClient?@vkurchatkin是另一个模块。我删除了代码中不重要的内容,但遗漏了这一点。我会编辑它away@damphat我认为在功能之外定义的设置将在每个设备上保持一致。但是,正如您看到的,我在哪里传递clientId,其他属性可以附加到objectAh,现在我看到了。好地方。啊,这很有道理。抱歉,设备Id是将我的代码简化为最简单形式的产物。