example angular angular-http-interceptors

example - http post angular 5



Angular 4 Http Interceptor: next.handle(…).do no es una función (4)

Creé este HTTPInterceptor para poder manejar mejor los errores http, estaba funcionando bien antes de hacer un git pull y ejecutar npm install.

Este es mi código:

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); } } }); } }

Y este es el error que recibo:

TypeError: next.handle (...). Do no es una función en GobaeInterceptor.webpackJsonp ... / .. / .. / .. / .. / src / app / services / gobae.interceptor.ts.GobaeInterceptor. interceptar (gobae.interceptor.ts: 12) en HttpInterceptorHandler.webpackJsonp ... / .. / .. / common/@angular/common/http.es5.js.HttpInterceptorHandler.handle (

¿Alguna cosa que pueda afectar mi código ha cambiado últimamente? ¿Qué puedo hacer ahora para "capturar" la respuesta http en mi interceptor?


Este error se produce porque falta el operador do . Lo siguiente importa con parche el objeto observable con el operador do .

import ''rxjs/add/operator/do'';

RxJs no viene con todas las funciones del operador por defecto para reducir el tamaño de la biblioteca. Debe importar los operadores que desea utilizar individualmente.


Terminé cambiando el operador de esto:

next.handle(req).do

A esto:

next.handle(req).subscribe

Parece que:

  1. Los operadores de rxjs ya no se cargan por defecto

  2. Dado que Angular ha implementado observables en las llamadas HTTP, suscribirse es el correcto


Tienes que usar la importación.

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


rxjs 6 / angular 6 necesitará el tubo

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