所以我有一个使用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时,代码实际上不会返回新的客户端实例。
如何重写这个简单的工厂才能正常运行?
答案 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中被称为模块模式。
编辑:已修复已解决的问题。