2014-04-14 14 views
8

Ho questo codice utilizzato all'interno di un Servizio angolare: -

var formData = function (data) { 
    var fd = new FormData(); 
    angular.forEach(data, function (value, key) { 
     fd.append(key, value); 
    }); 
    return fd; 
} 

var updateUserPic = function (profilePic, callback, userId) { 
    var userId = userId || FRAME_API.proxyUserId; // jshint ignore:line 
    if (!_.isFunction(callback)) { 
     throw new Error('You must provide a callback function.'); 
    } 
    $http({ 
     method: 'POST', 
     url: '/Learn/PostUserProfile.ashx?action=profilepic&userid=' + userId, 
     data: {up_picfile: profilePic}, 
     transformRequest: formData, 
     headers: { 'Content-Type': undefined} 
    }).success(function (data, status, headers, config){ 
     callback([data, status, headers, config]); 
     return; 
    }).error(function (data, status){ 
     console.log([status,data]); 
     callback(false); 
     return; 
    }); 
}; 

Controllo utilizzando la scheda di rete nei tool di sviluppo di Chrome dimostra che v'è una risposta 200 OK. Anche i dati passano come previsto. Tuttavia, il problema è che la richiamata error è l'unica che sia mai stata chiamata indipendentemente dal fatto che abbia uno stato di 200. Anche i parametri data e status si presentano come undefined.

Qualsiasi motivo questo sarebbe il caso?

La risposta del server è questo:

{status: 'success', path: 'assets/profile/profilepicture.png'} 

Si noti inoltre che questa risposta non può essere modificata da me. Viene dallo script di un fornitore in esecuzione sul server a cui non posso accedere.

+1

Puoi mostrarci quali dati provengono dal server? vederlo nella scheda di rete negli strumenti di sviluppo – karaxuna

+1

è possibile che l'angolare attende i dati json formattati e si restituiscono dati errati – karaxuna

+0

@karaxuna Aggiunta la risposta alle domande. – claydiffrient

risposta

3

ho usato un trasformatore di risposta personalizzato per trasformarlo a JSON valido:

var responseTransformer = function (data) { 

    return data.replace('status', '"status"') 
       .replace('\'success\'', '"success"') 
       .replace('path', '"path"') 
       .replace('\'assets/profile/profilepicture.png\'', 
         '"assets/profile/profilepicture.png"'); 

}; 

Questo ha funzionato bene:

+0

Nel mio caso il 'transformRequest: formData,' mancava nella mia richiesta, che lo ha risolto. –

2

restituito dati dovrebbe assomigliare a questa:

{ "status": "success", "path": "assets/profile/profilepicture.png" } 

nota "deve essere invece di '

+1

Purtroppo non ho il controllo del codice lato server, quindi non può cambiare. – claydiffrient

+1

Questo non è il problema – SomeKittens

+0

@ SomeKittensUx2666 hai ragione, forse il risultato che ha mostrato è già analizzato oggetto – karaxuna

0

Nel mio caso, il server restituiva un "File non installato" d "string, mentre il nativo $ http in Angular si aspettava una risposta di tipo" application/json ". Quindi, anche se il codice di stato era 200 OK, stava entrando nella parte .error del metodo http.

Per risolvere il problema, ho dovuto restituire un oggetto JSON dal server.

Problemi correlati