Ich habe diesen HTTPInterceptor erstellt, um besser mit http-Fehlern umgehen zu können. Er funktionierte gut, bevor ich einen Git-Pull durchführte und npm installierte.
Das ist mein Code:
import {Injectable} from '@angular/core';
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse} from '@angular/common/http';
import {Observable} from "rxjs";
import {ToasterService} from "angular2-toaster";
@Injectable()
export class GobaeInterceptor implements HttpInterceptor {
constructor(private toasterService: ToasterService){
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req)
.do(event => {
if (event instanceof HttpResponse) {
let response = event.body;
if(response.Error){
this.toasterService.pop('error', 'Error '+response.Code, response.Message);
}
}
});
}
}
Und das ist der Fehler, den ich bekomme:
TypeError: next.handle (...). Do ist keine Funktion bei GobaeInterceptor.webpackJsonp .../../../../../src/app/services/gobae.interceptor.ts.GobaeInterceptor. abfangen (gobae.interceptor.ts: 12) bei HttpInterceptorHandler.webpackJsonp .../../../common/@angular/common/http.es5.js.HttpInterceptorHandler.handle (
Hat sich in letzter Zeit etwas geändert, das sich auf meinen Code auswirken kann? Was kann ich jetzt tun, um die http-Antwort auf meinem Interceptor zu "fangen"?
Dieser Fehler wird ausgelöst, weil der Operator do
fehlt. Mit dem folgenden Befehl wird das beobachtbare Objekt mit dem Operator do
gepatcht.
import 'rxjs/add/operator/do';
RxJs werden standardmäßig nicht mit allen Operatorfunktionen gebündelt, um die Bibliotheksgröße zu reduzieren. Sie müssen die Operatoren importieren, die Sie einzeln verwenden möchten.
rxjs 6/angular 6 benötigt die Pipe
return next.handle(req).pipe(
tap(event => {
if (event instanceof HttpResponse) {
...
}
})
);
Sie müssen den Import verwenden.
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';
import 'rxjs/Observable';
import 'rxjs/add/observable/throw';
Am Ende habe ich den Operator folgendermaßen geändert:
next.handle(req).do
Dazu:
next.handle(req).subscribe
Es scheint, dass:
Operatoren von rxjs werden standardmäßig nicht mehr geladen
Da Angular Observables in HTTP-Aufrufen implementiert hat, ist subscribe die richtige Wahl