1

HttpInterceptor以内に約束をすることはできますか?例:Angular 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. 

私はトークンを取得しますが、エラーが発生しました。

+0

私はちょうど確認:あなたは、次の試みることができるので、約束と

イム良くありません開発者のツールの下で私のxhrの要求は、そこに 'ヒーロー'の要求はありません。したがって、インターセプタは要求を継続していません? – nightElf91

答えて

8

はい、インターセプタのコンストラクタメソッドに再リクエストされたサービスを挿入し、インターセプトの実装で値を取得し、新しい更新された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