2016-01-18 37 views
6

Aggiornamentofunzione Mappa Osservabile non in esecuzione (Angular2, http)

Il problema sembra essere che la funzione di mappa non viene eseguito su un "fallito" richiesta. Ciò significa che se l'API di cui sto parlando restituisce un errore 422 Validation Failed (o altri errori 4xx), Angular lo considera un errore e fa in modo che Observer esegua la richiamata dell'errore sottoscritto, saltando la funzione della mappa nel processo.

È possibile forzare Angolare per trattare alcuni errori 4xx come richieste riuscite o forzare la funzione della mappa per l'esecuzione anche quando un Osservabile restituisce un errore?


Ho il seguente codice in esecuzione nella mia app Angular2:

import {Injectable} from "angular2/core"; 
import {Observable} from "rxjs/Rx"; 
import {Http, Headers, ResponseOptions, Response} from "angular2/http"; 
import 'rxjs/add/operator/map'; 

... 

public login (email : string, password : string) { 
    return this.http.post(_endPoint + '/auth/login/', JSON.stringify({ 
     email: email, 
     password: password 
    }), { 
     headers: new Headers({ 
      'Content-Type': 'application/json' 
     }) 
    }) 
    .map (res => { 
     let data = res.json(); 
     console.log(data); 
     return data; 
    }); 
} 

Il codice è in esecuzione bene, con l'eccezione che la funzione di mappa non viene licenziato. Non ricevo errori e ho provato a eseguire il codice sia con che senza lo import 'rxjs/add/operator/map' con lo stesso risultato. Ho anche provato una più semplice funzione di mappa .map (res => res.json());.

In entrambi i casi, mi aspetto che il risultato restituito nella funzione .subscribe() sia la risposta JSON, ma invece ottengo la risposta non elaborata.

Edit: Aggiunta una schermata dei dati di richiesta, e la risposta

Request details

Risposta:

[{"field":"email","message":"Email or password incorrect."},{"field":"password","message":"Email or password incorrect."}] 

Ho anche provato su una richiesta del tutto efficace (Stato Codice: 200) e la funzione mappa sembra funzionare correttamente. Quindi immagino che funzioni solo quando viene restituita una risposta positiva. C'è un modo per farlo funzionare a prescindere, o specificare ulteriori codici di stato su cui dovrebbe essere eseguito?

+0

Potrebbe fornirci il contenuto della tua risposta? Codice di stato HTTP, intestazioni e payload? Grazie! –

+0

Acquista http://stackoverflow.com/questions/34113750/angular-2s-http-service-not-exposing-map-and-other-rxjs-functions ... scorri verso il basso per visualizzare la configurazione di SystemJS come menzionato da @MichaelOryl –

+0

@ thierrytemplier Ho uno screenshot dello stato, delle intestazioni e del carico utile e la risposta.Ho anche dettagliato cosa succede su una risposta di successo. – Tam

risposta

7

Come discusso con i commenti, il metodo map non viene chiamato perché la risposta contiene un codice di stato 422, cioè un errore. Quindi il metodo di cattura viene chiamato direttamente.

Se è necessario estrarre il contenuto JSON corrispondente all'errore si potrebbe provare qualcosa di simile nel tuo servizio:

getCompanies() { 
    return this.http.get('https://angular2.apispark.net/v1/companies1/', { 
    headers: headers 
    }).map(res => res.json()).catch(err => Observable.throw(err.json()); 
} 

Ora, nella componente che chiama il servizio, si sarà in grado di iscriversi. Il secondo parametro sarà chiamato nel tuo caso con il contenuto JSON della risposta:

service.getCompanies().subscribe(
    data => console.log('data = '+data), 
    err => console.log('err = '+JSON.stringify(err, null, 2)), // <--- 
() => console.log('complete') 
); 

Il contenuto stampato è:

err = { 
    "code": 404, 
    "description": "The server has not found anything matching the request URI", 
    "reasonPhrase": "Not Found" 
} 

Spero che ti aiuta, Thierry

Problemi correlati