Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点简单对象工厂模块_Javascript_Node.js_Factory_Mqtt - Fatal编程技术网

Javascript 节点简单对象工厂模块

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

所以我有一个节点应用程序,它利用了。我想将所有MQTT客户机创建逻辑封装在一个地方,以简化重构。我写了一个模版,如下所示:

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是将我的代码简化为最简单形式的产物。