node.js和异步模块错误

时间:2013-11-20 04:46:46

标签: javascript node.js

我在代码中得到一个未定义的变量,并且不确定代码中的错误是什么:

当我调用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未定义。

为什么?

1 个答案:

答案 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中的编程是(除了一些特殊情况)一种全同步方式。如果没有这样做,它只是在你运气好的情况下才会起作用或失败/成功。

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