1

我可以使用內HttpInterceptor承諾?例如:使用承諾在角HttpClient的攔截

export class AuthInterceptor implements HttpInterceptor{ 
this.someService.someFunction() 
    .then((data)=>{ 
     //do something with data and then 
     return next.handle(req); 
    }); 
} 

爲什麼我需要這個?因爲在向服務器發出請求之前,我需要獲取令牌以添加到請求標頭。

我的攔截器:

@Injectable() 
export class AuthInterceptor implements HttpInterceptor{ 

    constructor(private authService: AuthService){} 

    intercept(req: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>>{ 
     console.log('Intercepted!'); 
     // return next.handle(req); 
     this.authService.getToken() 
      .then((token)=>{ 
       console.log(token); 
       const reqClone = req.clone({ 
        headers: req.headers 
          .set('Authorization', 'Bearer ' + token) 
          .append('Content-Type', application/json') 
       }); 
       console.log(reqClone); 
       return next.handle(reqClone); 
      }) 
      .catch((err)=>{ 
       console.log('error in interceptor' + err); 
       return null; 
      }); 
    } 
} 

請求:

this.http.post(this.baseURL + 'hero', data) 
        .subscribe(
          (res: any) => { 
           console.log('Saved Successfully.'); 
           console.log(res); 
          }, 
          (err: any) => { 
           console.log('Save Error.' + err); 
          } 
         ); 

問題,我面對:

- >我得到這個錯誤的承諾得到解決之前。

You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable. 

承諾resloves,我讓我的標誌,但在錯誤發生後。

+0

我只是檢查在開發工具我XHR請求,沒有「英雄」的要求there.So,攔截不繼續請求? – nightElf91

回答

8

是的,你可以在攔截器的構造方法注入rewuired服務,並在攔截的實施檢索值,創建一個新的更新的HTTP請求並處理它。

生病更新我的答案,在一段時間的例子,即時通訊目前afk了

UPDATE:

我不是好有承諾,所以你可以嘗試以下方法:

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

感謝兄弟。我已經更新了這個問題。現在希望它更清楚。 – nightElf91

+0

@NishadAhsan更新我的回答 –

+0

它的工作。非常感謝。它不工作,因爲getToken()返回一個不可觀察的承諾? @ Jota.Toledo – nightElf91