我在代码中得到一个未定义的变量,并且不确定代码中的错误是什么:
当我调用getClient时,我将客户端视为未定义的... 我有一个肥皂客户端创建单身,我有:
var mySingleton = (function() {
var soap = require('soap');
var async = require('async');
var instance;
var client;
function init() {
var url = "http://172.31.19.39/MgmtServer.wsdl";
var endPoint = "https://172.31.19.39:9088";
var options = {};
options.endpoint = endPoint;
async.series([
function(callback) {
soap.createClient(url, options, function (err, result){
console.log('Client is ready');
client = result;
client.setSecurity(new soap.BasicAuthSecurity('admin-priv', 'password'));
callback();
});
}
],
function(err) {
if (err)
return next(err);
});
return {
getClient : function() {
console.log("I will give you the client");
**return client;**
},
publicProperty : "I am also public",
};
};
return {
getInstance : function() {
if (!instance) {
instance = init();
}
return instance;
}
};
})();
module.exports = mySingleton;
所以我的消费者是:
var soapC = mySingleton.getInstance();
var mySoapClient = soapC.getClient();
我得到mySingleton.client未定义。
为什么?
答案 0 :(得分:2)
当然有比这更好的解决方案,但它告诉你它可以更容易实现(没有异步,没有单例):
var soap = require('soap');
var client;
var url = "http://172.31.19.39/MgmtServer.wsdl";
var options = {
endpoint: "https://172.31.19.39:9088"
};
module.exports = {
getClient: function (callback) {
if (client) {
callback(null, client);
return;
}
soap.createClient(url, options, function (err, result) {
if (err) {
callback(err);
return;
}
console.log('Client is ready');
client = result;
client.setSecurity(new soap.BasicAuthSecurity('admin-priv', 'password'));
callback(null, client);
});
},
publicProperty: "I am also public"
};
使用客户端时:
// using the client
var mySoapServer = require('./path/to/above/code.js');
mySoapServer.getClient(function (err, client) {
if (err) { /* to error handling and return */ }
client.someRequestMethod(myEnvelope, function (err, response) {
// ...
});
});
当您的Soap-Clients遇到麻烦时可能会出现问题(如果出现错误,则无法重新连接逻辑)。为此,您可以查看Redis-Client,MySQL-Client,MongoDB-Client,...的源代码。
修改强>
对不同方法的一些评论:
此处不需要Singleton模式。 Node只执行一次这个JS文件,而require
只获得对导出的引用。无需创建IIFE范围 - 变量在外部不可见,只有导出。
Node.js中的编程是(除了一些特殊情况)一种全同步方式。如果没有这样做,它只是在你运气好的情况下才会起作用或失败/成功。
错误处理看起来非常像很多样板,但在大多数情况下都是必要的。