Use a promise in Angular HttpClient Interceptor

前端 未结 3 925
太阳男子
太阳男子 2020-12-29 05:05

Can I use promise within HttpInterceptor? For example:

export class AuthInterceptor implements HttpInterceptor{
this.someService.someFunction()
         


        
相关标签:
3条回答
  • 2020-12-29 05:37

    UPDATE: using rxjs@6.x

    import { from, Observable } from 'rxjs';
    import { switchMap } from 'rxjs/operators';
    
    @Injectable()
    export class AuthInterceptor implements HttpInterceptor {
    
        constructor(private authService: AuthService){}
    
        intercept(request: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>>{
            return from(this.authService.getToken())
                  .pipe(
                    switchMap(token => {
                       const headers = request.headers
                                .set('Authorization', 'Bearer ' + token)
                                .append('Content-Type', 'application/json');
                       const requestClone = request.clone({
                         headers 
                        });
                      return next.handle(requestClone);
                    })
                   );
        }
    }
    

    ORIGINAL ANSWER

    Yes, you could inject the required service into the constructor method of the interceptor, and in the implementation of intercept retrieve the value, create a new updated http request and handle it.

    I'm not good with promises, so you could try the following:

    import { fromPromise } from 'rxjs/observable/fromPromise';
    
    @Injectable()
    export class AuthInterceptor implements HttpInterceptor{
    
        constructor(private authService: AuthService){}
    
        intercept(req: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>>{
            return fromPromise(this.authService.getToken())
                  .switchMap(token => {
                       const headers = req.headers
                                .set('Authorization', 'Bearer ' + token)
                                .append('Content-Type', 'application/json');
                       const reqClone = req.clone({
                         headers 
                        });
                      return next.handle(reqClone);
                 });
        }
    }
    
    0 讨论(0)
  • 2020-12-29 05:48

    for RxJS 6+ I've updated Jota.Toledo's Answer:

    import { fromPromise } from 'rxjs/observable/fromPromise';
    
    @Injectable()
    export class AuthInterceptor implements HttpInterceptor{
    constructor(private authService: AuthService){}
    intercept(req: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>>{
        return fromPromise(this.authService.getToken())
              .pipe(switchMap(token => {
                   const headers = req.headers
                            .set('Authorization', 'Bearer ' + token)
                            .append('Content-Type', 'application/json');
                   const reqClone = req.clone({
                     headers 
                    });
                  return next.handle(reqClone);
             }));
     }  
    }
    
    0 讨论(0)
  • 2020-12-29 05:51

    My turn (Thanks to Jota.Toledo and Capripio) :

    1) Switch "fromPromise" to "from" --> fromPromise does not exist on type Observable

    2) Fix 'application/json' quote

    import { Observable, from } from 'rxjs';
    import { switchMap } from 'rxjs/operators';
    
    @Injectable()
    export class AuthInterceptor implements HttpInterceptor {
    
      constructor(private authService: AuthService){}
    
      intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    
          return from(this.authService.getToken()).pipe(
            switchMap(token => {
                const headers = req.headers
                    .set('Authorization', 'Bearer ' + token)
                    .append('Content-Type', 'application/json');
                const reqClone = req.clone({
                    headers
                });
                return next.handle(reqClone);
            }));
       }
    }
    

    My version of RxJs: "6.2.2" Hope that helped !

    0 讨论(0)
提交回复
热议问题