2017-12-18 41 views
0

これを投稿する前に私は他の多くの同様の質問に行き、解決策を見つけることができませんでした。 like Angular 2 - Inject authorization token before each Http requestHTTPコールの前に非同期的に認可トークンを取得する

私はHTTPリクエストを作成するための承認トークンを提供するAWSセッションを使用しています。今セッションを取得することは、トークンをリフレッシュする必要性に応じて、非同期操作にすることができます。

問題: セッションを取得してからHTTP呼び出しを行うことができません。

バージョン角度5、RxJs

のAuthServiceのgetセッション機能5.5.2。

getSession(): Observable<any> { 
     const sessionOb = new Subject<CognitoUserSession>(); 
     // AysnFn4session is a callback implementation 
     AysnFn4session((err, session) => { 
       console.log('Found Session'); 
       sessionOb.next(session); 
       sessionOb.complete(); 
      }); 
     return sessionOb; 
    } 

APIサービスのget関数 - トレイル1

get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
    return this._authService.getSession().switchMap((session) => { 
     console.log('dasdasd'); 
     let token = ''; 
     if (session) { 
     token = session.getIdToken().getJwtToken(); 
     options = options || {}; 
     options.headers = options.headers || new Headers(); 
     options.headers.append('Authorization', token); 
     } 
     return this._http.get(url, options); 
    }); 
    } 

APIサービスのget関数 - トレイル2

get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
return this._authService.getSession().pipe(mergeMap((session) => { 
    console.log('So what??'); 
    let token = ''; 
    if (session) { 
    token = session.getIdToken().getJwtToken(); 
    options = options || {}; 
    options.headers = options.headers || new Headers(); 
    options.headers.append('Authorization', token); 
    } 
    return this._http.get(url, options); 
})); 
} 

ここで私はこのAPIを呼び出すしていますか。

getItemInfo(item) { 
return this._apiHttp.get('/assets/data/item.json') 
    .map(res => { 
    console.log(res); 
    return res.json(); 
    }) 
    .subscribe(data => console.log(data), 
    err => console.log(err), 
    () => console.log('done')); 
} 

は、今の問題は、単にprints.andないHTTP呼び出しが行われている場合のコンソールの両方です。

Found Session 
done 

私は私が完了したHTTPリクエストを取得するためにswitchmapのmergermapを使用してミスを作っていますかを理解できないのです。

+0

これはあなたの 'getSession'メソッドと同じですか?これは' cognitoUser.getSession() 'ですか? – LLai

+0

@LLai cognitoUser.getSessionは、コールバック関数を使用するAWS coginito identiotyのメソッドです。混乱を避けるために問題のコードを単純化する。 – gaurang171

答えて

1

エラーはgetSession()にあります。あなたのAsynFn4sessionコールバックは、被験者の観察者がリスニングする前に完了しています。 (被験者の観察者は、購読した後に放出される値のみを受け取る)。これは、観測者が被検体を受信しないことを意味するので、観測可能なシーケンスは継続しません。私は被験者の代わりにオブザーバブルを使用するでしょう。

getSession(): Observable<any> { 
    return new Observable(observer => { 
     AsynFn4session((err, session) => { 
      observer.next(session); 
      observer.complete(); 
     }); 
    }); 
} 
+0

それは動作します。説明をありがとう。もう1つの質問。どのような場合に、被験者は使いやすいですか?私は、ほとんどのタスクが観測可能なものを使って達成できることを見ています。 – gaurang171

+1

@ gaurang171複数のオブザーバーに変更をブロードキャストする場合、通常、サブジェクトが使用されます。たとえば、認証されたユーザーをauthServiceに格納するとします。私はauthServiceから複数のコンポーネントにサブジェクトをサブスクライブすることができます。そのユーザーが自分の名前を変更すると、変更をすべてのオブザーバーに送信して、それに応じて対応できるようにします。したがって、観測データの観測者はデータソース/ストリームを取得するのに対して、データソース/ストリームを共有する観測者は大きな違いがあります。 – LLai

+1

説明ありがとうございます。今私は理解が深まりました。 :) – gaurang171