开发者问题收集

Angularjs soap 库在 Firefox 上抛出 typeError,但在 Chrome 上不会抛出

2015-12-08
693

我正在使用来自 Andrew McGivery 的 AngularJS soap 服务

从 Chrome 调用时,它运行良好,但在 Firefox 和 IE11 上返回 typeError。

TypeError: e is null at angular.soap.js line 16

有问题的代码如下:

.factory("$soap",['$q',function($q){
    return {
        post: function(url, action, params){
            var deferred = $q.defer();

            //Create SOAPClientParameters
            var soapParams = new SOAPClientParameters();
            for(var param in params){
                soapParams.add(param, params[param]);
            }

            var soapCallback = function(e){
                //ERROR THROWN ON LINE BELOW
                if(e.constructor.toString().indexOf("function Error()") != -1){
                    deferred.reject("An error has occurred.");
                } else {
                    deferred.resolve(e);
                }
            }

            SOAPClient.invoke(url, action, soapParams, true, soapCallback);

            return deferred.promise;
        },
        setCredentials: function(username, password){
            SOAPClient.username = username;
            SOAPClient.password = password;
        }
    }
}]);

e 在 Chrome 中是我的 webservice(用户对象)返回的对象,在 Firefox 中它为空,我不知道在库中查找什么地方来调试问题。

更新:

我的控制器如下所示:

.controller('SoapCtrl', function($soap) {

    this.login = function(credentials) {

        $soap.post('MYAPI', 'MYMETHOD', {login: credentials.login, password: credentials.password}).then(function(data) {
            console.log(data.userid);
        });
    }

})

我也尝试从 jquery 插件调用相同的 webservice jquery.soap 在我的 Angular 应用程序中,我在 Chrome 和 Firefox 中都获得了预期的行为。

最后更新

由于这是一个专业项目,我们决定转向一个有效的插件。 jquery.soap

2 个问题已发布在 作者页面 上,目前尚无答案。

我本应将赏金授予有效答案,但一半的赏金将自动分配给获得 2 个赞同的答案……

2个回答

在库中,检查文件 soapclient.js,在第 195 行

SOAPClient._onSendSoapRequest = function(method, async, callback, wsdl, req) 
{
    var o = null;
    var nd = SOAPClient._getElementsByTagName(req.responseXML, method + "Result");
    if(nd.length == 0)
        nd = SOAPClient._getElementsByTagName(req.responseXML, "return");   // PHP web Service?
    if(nd.length == 0)
    {
        if(req.responseXML.getElementsByTagName("faultcode").length > 0)
        {
            if(async || callback)
                o = new Error(500, req.responseXML.getElementsByTagName("faultstring")[0].childNodes[0].nodeValue);
            else
                throw new Error(500, req.responseXML.getElementsByTagName("faultstring")[0].childNodes[0].nodeValue);           
        }
    }
    else
        o = SOAPClient._soapresult2object(nd[0], wsdl);
    if(callback)
        callback(o, req.responseXML);
    if(!async)
        return o;
}

如果您说在 Firefox 中 e 值为 null ,那是因为在此方法中 o 变量从未设置过。调试此方法会有所帮助。

Gonzalo Pincheira Arancibia
2015-12-14

在函数 SOAPClient._getElementsByTagName
我更改了以下行
return document.getElementsByTagName(tagName);
对于
return document.getElementsByTagNameNS("*", tagName);

对我有用!

Celso Augusto Klingel
2016-09-22