30 votes

Angular 4 Http Interceptor: next.handle (...). Do n'est pas une fonction

J'ai créé ce HTTPInterceptor pour être en mesure de mieux gérer les erreurs http, il fonctionnait bien avant, j'ai fait un git pull et courut npm install.

C'est mon 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);
                    }
                }
            });
    }
}

Et c'est l'erreur que je reçois:

TypeError: suivant.la poignée(...).n'est pas une fonction au GobaeInterceptor.webpackJsonp.../../../../../src/app/services/gobae.interceptor.ts.GobaeInterceptor.intercept (gobae.l'intercepteur.ts:12) au HttpInterceptorHandler.webpackJsonp.../../../common/@angular/common/http.es5.js.HttpInterceptorHandler.handle (

A fait quelque chose qui peut affecter mon code a changé dernièrement? que puis-je faire maintenant pour "attraper" la réponse http sur mon interceptor?

53voto

user8510992 Points 526

Cette erreur est levée car il vous manque l'opérateur do . L'importation ci-dessous avec patch l'objet observable avec l'opérateur do .

 import 'rxjs/add/operator/do';
 

RxJs n'est pas fourni avec toutes les fonctions d'opérateur par défaut pour réduire la taille de la bibliothèque. Vous devez importer les opérateurs que vous souhaitez utiliser individuellement.

26voto

Shawn Palmer Points 251

rxjs 6 / angular 6 aura besoin du tuyau

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

8voto

Hebert Godoy Points 106

Vous devez utiliser l'importation.

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

-1voto

Multitut Points 846

J'ai fini par changer d'opérateur à partir de ceci:

 next.handle(req).do
 

Pour ça:

 next.handle(req).subscribe
 

Il paraît que:

  1. Les opérateurs de rxjs ne sont plus chargés par défaut

  2. Étant donné qu'Angular a implémenté des observables sur les appels HTTP, l'abonnement est le bon choix

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X