节点简单对象工厂模块

所以我有一个使用MQTT的节点应用程序。 我想把所有的MQTT客户端创build逻辑封装在一个地方,以减轻重构。 我写了一个如下所示的模板:

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编程技巧。 无论什么原因,只要我用多个客户端创build运行这个代码,所有的地狱都会崩溃。 他们打得不好,踢对方连线。

但是,如果我直接在每个文件中input完全相同的代码,则没有问题。 团队中更有经验的节点开发人员之一说,这可能是节点caching用户模块的方式? 当多次调用创build客户端时,代码实际上不会返回新的客户端实例。

我怎样才能重写这个简单的工厂正常工作?

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

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

编辑:修正了解决问题。

    Interesting Posts