2016-05-05 9 views
20

Teraz tak jak ja http żądania (zapożyczone z this answer) jest taka:Jak radzić sobie z kodów stanu HTTP inny niż 200 kątowej 2

POST(url, data) { 
     var headers = new Headers(), authtoken = localStorage.getItem('authtoken'); 
     headers.append("Content-Type", 'application/json'); 

     if (authtoken) { 
     headers.append("Authorization", 'Token ' + authtoken) 
     } 
     headers.append("Accept", 'application/json'); 

     var requestoptions = new RequestOptions({ 
      method: RequestMethod.Post, 
      url: this.apiURL + url, 
      headers: headers, 
      body: JSON.stringify(data) 
     }) 

     return this.http.request(new Request(requestoptions)) 
     .map((res: Response) => { 
      if (res) { 
       return { status: res.status, json: res.json() } 
      } 
     }); 
    } 

Działa to dobrze, z wyjątkiem faktu, że angular2 wola powiedzie się, jeśli kod statusu zwracany jest coś innego niż 200. na przykład, jeśli użytkownik chce, aby umieścić coś i serwer zwraca 400, kątowe 2 rzuci wyjątek:

przechwycony wyjątek: [object Object]

Jak mogę tego uniknąć? Chciałbym obsłużyć te kody statusu w mojej aplikacji, aby zwiększyć wygodę użytkownika (pokazywać błędy itp.).

Odpowiedz

41

Tak, możesz obsłużyć takiego operatora catch i pokazać alert tak, jak chcesz, ale najpierw musisz zaimportować Rxjs za samo jak ten sposób

import {Observable} from 'rxjs/Rx'; 

return this.http.request(new Request(this.requestoptions)) 
      .map((res: Response) => { 
       if (res) { 
        if (res.status === 201) { 
         return [{ status: res.status, json: res }] 
        } 
        else if (res.status === 200) { 
         return [{ status: res.status, json: res }] 
        } 
       } 
      }).catch((error: any) => { 
       if (error.status === 500) { 
        return Observable.throw(new Error(error.status)); 
       } 
       else if (error.status === 400) { 
        return Observable.throw(new Error(error.status)); 
       } 
       else if (error.status === 409) { 
        return Observable.throw(new Error(error.status)); 
       } 
       else if (error.status === 406) { 
        return Observable.throw(new Error(error.status)); 
       } 
      }); 
    } 

również można Händel błędu (err) z bloku, który jest rzut przez blok catch podczas .map funkcja,

tak -

... 
.subscribe(res=>{....} 
      err => {//handel here}); 

Aktualizacja

wymagane dla każdego bez sprawdzania statusu particluar jedną można spróbować w ten sposób: -

return this.http.request(new Request(this.requestoptions)) 
      .map((res: Response) => { 
       if (res) { 
        if (res.status === 201) { 
         return [{ status: res.status, json: res }] 
        } 
        else if (res.status === 200) { 
         return [{ status: res.status, json: res }] 
        } 
       } 
      }).catch((error: any) => { 
       if (error.status < 400 || error.status ===500) { 
        return Observable.throw(new Error(error.status)); 
       } 
      }) 
      .subscribe(res => {...}, 
         err => {console.log(err)}); 
+0

to możliwe, aby nie trzeba pisać każdy kod stanu jako warunek? Tak jak w przypadku zwrotu, status, a następnie moje komponenty mogą określić, co zrobić z tymi kodami statusu. –

+0

Tak, możesz po prostu zwrócić błąd bez sprawdzania stanu, który zależy od tego, w jaki sposób chcesz przekazać blok błędu. –

+0

Czy mógłbyś to edytować? Trudno jest to zrobić za pomocą istniejącego przykładu. –

Powiązane problemy