Angularjs soap库在Firefox上抛出类型错误,而不是在Chrome上
我正在使用来自的AngularJS的soap服务 当从Chrome调用时,它可以完美地工作,但在Firefox和IE11上返回一个typeError TypeError:e在angular.soap.js第16行为null 有关守则如下: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
.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。目前,该方法直接在控制器中调用,但将来将使其成为服务。