2017-07-28 15 views
7

Uygun şekilde davranabilmek için kodunu 401 ve diğer hataları kesiştirmek istiyorum.HttpInterceptor in Angular 4.3: 400 hata yanıtını engelleme

zone.js:2616 GET http://localhost:8080/backend/rest/wrongurl 404 (Not Found)

: Bu o

Ben Chrome'un geliştirici konsolunda gördüğüm şudur hata respsonses müdahale etmez, 200 istekleri için sorunsuz bir şekilde kullanılmaktadır

import { LoggingService } from './../logging/logging.service'; 
import { Injectable } from '@angular/core'; 
import { HttpInterceptor, HttpHandler, HttpRequest, HttpEvent, HttpResponse, HttpErrorResponse } from '@angular/common/http'; 

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/do'; 

@Injectable() 
export class TwsHttpInterceptor implements HttpInterceptor { 

    constructor(private logger: LoggingService) { } 

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     this.logger.logDebug(request);  
     return next.handle(request) 
      .do(event => { 
       if (event instanceof HttpResponse) { 
        this.logger.logDebug(event); 
       } 
      }); 
    } 
} 

: Bu benim önleme olduğunu Veya bu

zone.js:2616 GET http://localhost:8080/backend/rest/url 401 (Unauthorized)

Benim bu engelle başa çıkmak gibi. Neyi kaçırıyorum ?

cevap

17

Http hataları gözlemlenebilir bir hata akış aşağı aşağı gönderir, böylece .catch ile bunları yakalamanız gerekir (bu here hakkında daha fazla bilgi edinebilirsiniz). Bu Kullanmak, ama umarım başkası yararlı bulacaksınız için artık çok geç muhtemelen

return next.handle(request) 
    .do(event => { 
    if (event instanceof HttpResponse) { 
     this.logger.logDebug(event); 
    } 
    }) 
    .catch(err => { 
    console.log('Caught error', err); 
    return Observable.throw(err); 
    }); 
+0

Tamam, ama bu bana şu hatayı veriyor: [ts] "Bağımsız değişken türü" (err: any) => void 'parametresine atanamaz' (err: varsa, yakalandı: Gözlemlenebilir >) => Gözlemlenebilir Giriş <{}> '. Tür 'void', 'ObservableInput <{}>' için atanabilir. – Tim

+0

"return Observable.throw (err);" ekleme sorunu giderir. Cevabınızı düzenleyin ve kabul edeceğim! – Tim

+0

@Tibi böyle mi? Üzgünüm, göndermeden önce test etmedim :) – 0mpurdy

4

... Bu da hata yanıtlarını göndermek için yukarıdaki return ifadesini yeniden yazmak için yapılması gerekenler:

return next.handle(request).do((event: HttpEvent<any>) => { 
    if (event instanceof HttpResponse) { 
    this.logger.logDebug(event); 
    } 
}, (error: any) => { 
    if (error instanceof HttpErrorResponse) { 
    this.logger.logDebug(error); 
    } 
}); 

return next.handle(request).do((event: HttpEvent<any>) => { 
    if (event instanceof HttpResponse) { 
    // process successful responses here 
    } 
}, (error: any) => { 
    if (error instanceof HttpErrorResponse) { 
    if (error.status === 401) { 
     authService.logout(); 
    } 
    } 
}); 

çalışıyor lik: Ben otomatik olarak oturum kapatma yöntemine doğrudan tüm 401 Yetkisiz yanıtları göndermek için bu aynı metodolojiyi kullanıyorum

(tek tek http çağrısına bir 401 kontrol etmekten) Mutlak bir çekicilik. :)

+0

Bir hata durumunda, hatayı günlüğe kaydetmek istiyorum ama yine de bir HttpResponse döndürdüm, böylece Açısal istemci kullanıcı arayüzünde hata mesajını gösterilsin mi? –

+0

Sorunuzda "HttpErrorResponse" ifadesini kastettiyseniz (HttpResponse yerine), yanıtımdaki ilk örnek tam olarak bunu gösterir. Hem başarı yanıtları hem de hata yanıtları günlüğe kaydedilir ve daha sonra hiç durdurucu olmamış gibi iletilir. – Enrika

+0

Doğrulama hatalarımı alamadım. – Velkumar