Saltar al contenido

HttpInterceptor en Angular 4.3: interceptando 400 respuestas de error

Recabamos en el mundo online para brindarte la respuesta para tu problema, si tienes alguna inquietud puedes dejarnos tu duda y te contestamos porque estamos para servirte.

Solución:

Http envía errores por el flujo de errores de un observable, por lo que deberá detectarlos con .catch (Puedes leer más sobre esto aquí).

return next.handle(request)
  .do(event => 
    if (event instanceof HttpResponse) 
      this.logger.logDebug(event);
    
  )
  .catch(err =>  
    console.log('Caught error', err);
    return Observable.throw(err);
  );

En ese momento estaba tratando Angular7+.

Desafortunadamente Las soluciones anteriores no sirvieron bien para el trabajo porque .do no está disponible directamente en HttpHandler a partir de la noción de 6 tubos RxJs; y convertir Observable to Promise no se pega

Aquí hay un enfoque limpio y actualizado; yo pipe la catchError operador y analice el error y finalmente vuelva a lanzarlo usando throwError. Aquí está la forma final del interceptor;

  intercept(req: HttpRequest, next: HttpHandler): Observable> 
    return next.handle(req).pipe(
      catchError((error: HttpErrorResponse) => 
        if (error.error instanceof ErrorEvent) 
          // client-side error or network error

         else 
          // TODO: Clean up following by introducing method
          if (error.status === 498)  
            // TODO: Destroy local session; redirect to /login
          
          if (error.status === 401)  
            // TODO: Permission denied; show toast
          
        
        return throwError(error);
      )
    );
  

Esperemos que esta solución ayude a alguien en el futuro.

Probablemente sea demasiado tarde para que lo use, pero con suerte alguien más lo encontrará útil… Esta es la forma de reescribir la declaración de retorno anterior para registrar también las respuestas de error:

return next.handle(request).do((event: HttpEvent) => 
  if (event instanceof HttpResponse) 
    this.logger.logDebug(event);
  
, (error: any) => 
  if (error instanceof HttpErrorResponse) 
    this.logger.logDebug(error);
  
);

Estoy usando esta misma metodología para enviar automáticamente todas las respuestas 401 no autorizadas directamente a nuestro método de cierre de sesión (en lugar de buscar un 401 en cada llamada individual a http):

return next.handle(request).do((event: HttpEvent) => 
  if (event instanceof HttpResponse) 
    // process successful responses here
  
, (error: any) => 
  if (error instanceof HttpErrorResponse) 
    if (error.status === 401) 
      authService.logout();
    
  
);

Funciona como un encanto absoluto. 🙂

Sección de Reseñas y Valoraciones

Finalizando este artículo puedes encontrar las reseñas de otros programadores, tú asimismo puedes dejar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *