2015-12-08 6 views
15

sto utilizzando il servizio di sapone per l'AngularJS da Andrew McGiverybiblioteca sapone Angularjs getta una TypeError su Firefox, Chrome non in

Funziona perfettamente quando viene chiamato da Chrome, ma restituisce un TypeError su Firefox e IE11.

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

Il codice in questione è la seguente:

.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 in Chrome è l'oggetto restituito dal mio webservice (oggetto utente), in Firefox è nullo e non so dove cercare nella libreria per eseguire il debug del problema.

UPDATE:

mio regolatore di simile a questa:

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

}) 

Ho anche provato a chiamare lo stesso webservice dal plugin jQuery jquery.soap all'interno della mia applicazione angolare e ottengo il comportamento previsto in entrambe Chrome e Firefox.

ULTIMO AGGIORNAMENTO

Poiché si tratta di un progetto professionale, abbiamo deciso di passare a un plugin che funziona. jquery.soap

Sono stati pubblicati 2 numeri su author's page senza risposta per il momento.

avrei assegnato il premio per una risposta valida, ma la metà di taglie sta andando automaticamente alla risposta con 2 upvotes ...

+0

La tua API è sullo stesso dominio della pagina web? Vedi le tue richieste API in FireBug come riuscite? Questo errore viene generato quando la richiesta API non è riuscita. Ho creato una semplice pagina di test e il sapone angolare funziona perfettamente per me (http://ypnh.shkryob.webfactional.com/soap/). –

+0

@KostyaShkryob l'API non si trova sullo stesso dominio ma abbiamo configurato CORS e il servizio funziona su Chrome. In firebug posso vedere la risposta attesa dal webservice. Getta solo l'eccezione sopra e non continua. Ho la stessa configurazione che hai in quel collegamento e chiamo $ soap allo stesso modo. – gyc

+0

I browser potrebbero funzionare con le intestazioni CORS in modo leggermente diverso.Potrebbe essere necessario aggiungere Access-Control-Allow-Credentials: true o altri –

risposta

1

nella funzione SOAPClient._getElementsByTagName
posso cambiare la linea
return document.getElementsByTagName(tagName);
Per
return document.getElementsByTagNameNS("*", tagName);

lavoro per me!

2

sulla libreria, controllare i soapclient.js di file, sulla linea 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; 
} 

se si dice che in Firefox il valore e è null è perché in questo metodo la variabile o non è impostato. Eseguire il debug di questo metodo sarà di aiuto.

+0

Ho già eseguito il debug di quel metodo. Non ho trovato nulla tranne che la variabile è impostata in Chrome e non in Firefox. – gyc

+0

Ho letto l'aggiornamento e vedo che userete il sapone jquery. Sposterai il tuo progetto su jquery o integrerai questa libreria con angolare. Se usi l'angolare, ti consiglio di farlo usando le direttive angolari. –

+1

Ho installato jquery.soap con bower nella mia app angolare. Per il momento il metodo viene chiamato direttamente in un controller ma lo renderà un servizio in futuro. – gyc

Problemi correlati