Угловая труба v6 (карта ()) выпуск - PullRequest
0 голосов
/ 03 октября 2018

Буду признателен, если кто-нибудь сможет пролить свет на это.Я был в этом в течение нескольких дней.

Вот две функции, которые живут в моей службе аутентификации.Функция входа в систему, которая получает действительный jwt, а затем функция обновления, которая извлекает обновленный jwt.

ВХОД

  login(username: string, password: string): Observable<any> {
    const headers = new HttpHeaders().set('Authorization', `Basic ${environment.WSO2_AUTH_BASIC}`);
    const params = new HttpParams({
    fromObject: {
     grant_type: 'password',
     scope: 'openid',
     username: username,
     password: password
   }
 });

  return this.http.request<Token>('POST', environment.API_HOST + '/token', {
    headers: headers,
    body: params
  }).pipe(map(this._mapTokenResponse));
}

ОБНОВЛЕНИЕ

  private _refreshToken() {
const headers = new HttpHeaders().set('Authorization', `Basic ${environment.WSO2_AUTH_BASIC}`);
this.token = this.getToken();
const params = new HttpParams({
  fromObject: {
    grant_type: 'refresh_token',
    scope: 'openid',
    refresh_token: this.token.refresh_token
  }
});
return this.http.request<Token>('POST', environment.API_HOST + '/token', {
  headers: headers,
  params: params
}).pipe(map(this._mapTokenResponse, this));
}

Я создал отдельную функцию стрелки, которая обрабатывает отображение дляоба.

private _mapTokenResponse = (token: Token) => {
// login successful if there's a jwt token in the response
if (token && token.access_token) {
  // store user details and jwt token in local storage to keep user logged in between page refreshes
  token.id_token_data = this.jwtHelper.decodeToken(token.id_token);
  this._setSession(token);
}
return token;

}

Я хочу это, чтобы я не дублировал код.Функция входа в систему работает отлично, но токен обновления возвращает эту ошибку:

ERROR Error: "Uncaught (in promise): TypeError: argument is not a function. Are you looking for `mapTo()`?

Я импортировал карту из 'rxjs / operator'

1 Ответ

0 голосов
/ 03 октября 2018

Либо вы можете сделать:

  return this.http.request<Token>('POST', environment.API_HOST + '/token', {
    headers: headers,
    body: params
  }).pipe(
    map(this._mapTokenResponse.bind(this))
  );

Мы используем .bind(this), чтобы установить область действия ("this") вызова функции.В противном случае вы получите сообщение об ошибке при каждом вызове this. в функции обратного вызова.

Или:

  return this.http.request<Token>('POST', environment.API_HOST + '/token', {
    headers: headers,
    body: params
  }).pipe(
    map((token: Token) => this._mapTokenResponse(token))
  );

На мой взгляд, это решение намного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...