gpt4 book ai didi

javascript - node.js 和异步模块错误

转载 作者:行者123 更新时间:2023-11-30 17:46:22 25 4
gpt4 key购买 nike

我在我的代码中得到一个 undefined variable ,但不确定我的代码中的错误是什么:

当我调用 getClient 时,我得到未定义的客户端...我有一个 soap 客户端创建单例,我有:

    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 未定义。

为什么?

最佳答案

当然有比这个更好的解决方案,但它向您展示了它可以更容易地实现(没有异步,没有单例):

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 的源代码,...

编辑

对不同方法的一些评论:

这里不需要单例模式。 Node 只会执行此 JS 文件一次,并且以后的 require 只会获得对导出的引用。无需创建 IIFE 范围 - 变量在外部不可见,只有导出。

在 Node.js 中编程(除了一些特殊情况)是一种全异步的方式。如果不这样做,它就不会起作用,或者只有当你运气好/坏时才会失败/成功。

错误处理看起来很像很多样板文件,但在大多数情况下是必要的。

关于javascript - node.js 和异步模块错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20087573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com