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:
Los operadores de rxjs ya no se cargan por defecto
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) {
...
}
})
);