节点简单对象工厂模块

时间:2013-12-31 18:49:27

标签: javascript node.js factory mqtt

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

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);
}

我对节点很新,并且说我有中级javascript编程技巧。无论出于何种原因,每当我使用多个客户端创建运行此代码时,所有地狱都会崩溃。他们不会打得很好并且互相踢球。

但是,如果我在每个文件中直接输入完全相同的代码,则没有问题。该团队中一位经验丰富的节点开发人员表示,它可能与节点缓存用户模块的方式有关吗?每当多次调用create client时,代码实际上不会返回新的客户端实例。

如何重写这个简单的工厂才能正常运行?

2 个答案:

答案 0 :(得分:3)

问题是您共享settings,但也会在每次通话时修改它们。这有助于:

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);
}

此外,您需要从参数或其他合法地点获取deviceId

答案 1 :(得分:0)

// 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中被称为模块模式。

编辑:已修复已解决的问题。