【问题标题】:Node Simple Object Factory Module节点简单对象工厂模块
【发布时间】:2013-12-31 18:49:27
【问题描述】:

所以我有一个使用MQTT 的节点应用程序。我想将我所有的 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 时,代码实际上不会返回新的客户端实例。

如何重写这个简单的工厂以使其正常运行?

【问题讨论】:

  • deviceId 来自哪里?
  • 我们应该克隆设置变量,你怎么能用单端口调用createClient?
  • @vkurchatkin 一个不同的模块。我删除了对代码不必要的任何内容并错过了这一点。我将其编辑掉
  • @damphat 我认为在函数外部定义的设置将在每个设备上保持一致。但是,正如您所看到的,我在哪里传递了 clientId,其他属性可以附加到对象

标签: javascript node.js factory mqtt


【解决方案1】:

问题是你共享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

【讨论】:

  • 啊,现在我明白了。好地方。
  • 啊,很有意义。抱歉,设备 ID 是将我的代码简化为最简单形式的产物。
【解决方案2】:
// 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中称为模块模式。

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

【讨论】:

  • 这行不通。首先,一个错字 - export,其次是 var youMod = require('./yourMod')();,而不是你所拥有的。
  • 错字很明显,第二个不是
  • 好吧,已经解决了。
  • 是的,很酷。另外,如果你这样做var yourMod = require('./yourMod') (); var one = yourMod.createClient(1); var two = yourMod.createClient(2)问题依然存在
  • 是的,他成功了。但是,在 node 中工作时了解模块模式还是很好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
相关资源
最近更新 更多