Перехватчик в Angular 9

#angular #typescript

#angular #typescript

Вопрос:

Приветствую, я внедряю перехватчик в Angular 9, при захвате, когда idtoken неверен, он генерирует новые токены, но запрос больше не отправляется, код перехватчика такой:

 import { Injectable } from '@angular/core';
import {
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';
import { AuthService } from 'src/app/services/auth.service';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

  constructor(private auth:AuthService) {}
  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
    console.log ("solicitud interceptada correctamente!"); 
    let data = JSON.parse(localStorage.getItem('data'));
    let refreshToken = data['data'].refreshToken;
    console.log('refreshToken',refreshToken);

    return next.handle(request).pipe(catchError(err => {
      console.log(err.error);
      if (err.error.code === 401) {
        console.log('Refresh Token');
          if (err.error.message == "Token no valido.") {
            console.log('Refresh Token');
            let refresh={
              "refreshToken":refreshToken
            }
            this.auth.getTokenRefresh(refresh)
            .subscribe(respt =>{
              // this.datar['data'].refreshToken=respt['data'].refreshToken;
              data['data'].idToken=respt['data'].idToken;
              data['data'].accessToken=respt['data'].accessToken;

              this.auth.guardarToken(respt['data'].idToken);
              this.auth.guardarRespuesta(data);
              console.log(respt);
              console.log("Datos Refrescar",data);
              console.log("Id token Refrescar",respt['data'].idToken);

              request = request.clone({ 
              setHeaders: { 
                'Application': 'UEhBTlRPTVhfV0VC',
                'Authorization': `Bearer ${respt['data'].idToken}` 
              } 
              });   
              // this.router.navigate(['/seguridad/gestion-usuarios']);
            },(err) =>{
              // this.error=err.error['message'];
              // this.erroru=true;
              console.log(err.error);
            });
            return next.handle(request); 
              //TODO: Token refreshing
          }else {
              //Logout from account or do some other stuff
          }
      }
      return next.handle(request); 
      // return next.handle(request);
    }));
    
  }
}
  

Я понимаю, что «return next.handle (запрос);» Он снова генерирует запрос, но я не знаю, почему это не сделано, я много исследовал, но я не получаю решения, я был бы признателен за помощь

Ответ №1:

Вы должны подождать, пока API токена обновления не вернет ответ. Если вы не знаете, как дождаться ответа http, прежде чем перейти к следующей строке кода, прочитайте либо об «асинхронности и ожидании», либо о «forkJoin».

Комментарии:

1. Как бы я это сделал? У меня нет большого опыта работы с await