En su artículo en Medium, Ryan Chenkie sugiere utilizar el siguiente código para interceptar las respuestas 401:
[sourcecode language="javascript"]
importa 'rxjs/add/operator/do';
export class JwtInterceptor implements HttpInterceptor {
constructor(public auth:AuthService) {}
intercept(request: HttpRequest
return next.handle(request).do((event: HttpEvent
if (event instanceof HttpResponse) {
// haz cosas con la respuesta si quieres
}
}, (err: any) => {
if (err instanceof HttpErrorResponse) {
if (err.status === 401) {
// redirige a la ruta de inicio de sesión
// o muestra un modal
}
}
});
}
}
[/sourcecode]
Hay un problema con este enfoque, y es el uso del operador Rx do(). La cadena observable continuará después del gestor de errores en el segundo argumento de do(). La respuesta de error puede burbujear a un gestor de errores genérico o a un servicio o componente.
En nuestro caso, esto evitó una redirección a la página de inicio de sesión.
Sugiero la siguiente mejora, sustituyendo do() por catch():
[sourcecode language="javascript"]
importa 'rxjs/add/operator/catch';
@Injectable()
export class UnauthorisedInterceptor implements HttpInterceptor {
constructor(
private router: Router
) {}
intercept(request: HttpRequest
return next.handle(request).catch((err: any) => {
if (err instanceof HttpErrorResponse && err.status === 401) {
this.router.navigate(['/login'], {
queryParams: {
redirectTo: document.location.pathname
}
});
// esta respuesta se gestiona
// detiene la cadena de gestores devolviendo vacío
return Observable.empty();
}
// rethrow para que otros gestores de errores puedan recogerlo
return Observable.throw(err);
});
}
}
[/sourcecode]
Autor: | 01 oct 2017