webentwicklung-frage-antwort-db.com.de

Angular 4 Http Interceptor: next.handle (...). Do ist keine Funktion

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"?

28
Multitut

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.

51
user8510992

rxjs 6/angular 6 benötigt die Pipe

return next.handle(req).pipe(
  tap(event => {
    if (event instanceof HttpResponse) {
      ...
    }
  })
);
19
Shawn Palmer

Sie müssen den Import verwenden.

import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';
import 'rxjs/Observable';
import 'rxjs/add/observable/throw';
8
Hebert Godoy

Am Ende habe ich den Operator folgendermaßen geändert:

next.handle(req).do

Dazu:

next.handle(req).subscribe

Es scheint, dass:

  1. Operatoren von rxjs werden standardmäßig nicht mehr geladen

  2. Da Angular Observables in HTTP-Aufrufen implementiert hat, ist subscribe die richtige Wahl

0
Multitut