Angularjs soap库在Firefox上抛出类型错误,而不是在Chrome上

Angularjs soap库在Firefox上抛出类型错误,而不是在Chrome上,angularjs,soap,Angularjs,Soap,我正在使用来自的AngularJS的soap服务 当从Chrome调用时,它可以完美地工作,但在Firefox和IE11上返回一个typeError TypeError:e在angular.soap.js第16行为null 有关守则如下: .factory("$soap",['$q',function($q){ return { post: function(url, action, params){ var deferred = $q.defer

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

当从Chrome调用时,它可以完美地工作,但在Firefox和IE11上返回一个typeError

TypeError:e在angular.soap.js第16行为null

有关守则如下:

.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;
        }
    }
}]);
Chrome中的e是我的webservice(用户对象)返回的对象,而Firefox中的e是null,我不知道从库中查找到哪里来调试这个问题

更新:

我的控制器如下所示:

.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);
        });
    }

})
我还尝试从angular应用程序中的jquery插件调用相同的webservice,我在Chrome和Firefox中都得到了预期的行为

上次更新

由于这是一个专业的项目,我们决定继续使用一个有效的插件

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
变量从未设置过。调试此方法将有帮助。

在函数
SOAPClient.\u getElementsByTagName

我换行
return document.getElementsByTagName(标记名)
对于
return document.getElementsByTagnames(“*”,标记名)


为我工作

你的API和网页在同一个域上吗?您是否认为FireBug中的API请求成功?API请求失败时引发此错误。我制作了一个简单的测试页面,angular soap对我来说很好()。@KostyaShkryob API不在同一个域中,但我们已经配置了CORS,并且该服务可以在Chrome上运行。在firebug中,我可以看到Web服务的预期响应。它只是抛出上面的异常,不会继续。我的设置与您在该链接中的设置相同,我以相同的方式调用$soap。浏览器使用CORS头的方式可能略有不同。您可能需要添加访问控制允许凭据:true或其他我可以看到中的访问控制允许凭据设置为truefirebug@gyc关于
Access Control Allow Origin
header,检查它是否存在,也可以通过删除凭据进行检查,然后让我知道结果?我已经调试了该方法。除了在Chrome中设置的变量,而不是在Firefox中,我没有发现任何东西。我阅读了您的更新,并看到您将使用jquery soap。您可以将项目移动到jquery,或者将此库与angular集成。如果您使用angular,我建议您使用angular指令。我在angular应用程序中安装了jquery.soap和bower。目前,该方法直接在控制器中调用,但将来将使其成为服务。