Сделать HTTP-запрос от Interceptor - PullRequest
0 голосов
/ 09 апреля 2020

Цель - токен доступа включен в запрос для просмотра пользовательского c контента, такого как профиль, заказы и т. Д. c. Теперь, когда такие ресурсы запрашиваются из приложения angular, я проверяю действительность токена доступа и, если срок его действия истек, тогда возвращаю указанный код c - ERR_TKN_EXP из моего бэкэнда, в перехватчике я проверяю эту ошибку код и, соответственно, хотите запустить HTTP-запрос для создания нового токена на серверной части. Здесь HTTP-запрос не инициализируется из Interceptor.

Что я пробовал:

Interceptor:

return next.handle(request).pipe(catchError(err => {

      //const error = err.error.message || err.statusText;

      const resError = err.error;

      // Handle token expired case to generate a new token
      if (err.status === 401 && resError.error.code == 'ERR_TKN_EXP') {
        this.authService.refreshToken();


      }
  }))

AuthService - функция refreshToken.

 refreshToken(){

    this.generate_ac_tkn = true;

    let refTokenParams = {
      'auth-token' : this.ac_tkn,

    }

    alert("refreshToken");

    return  this.http.post(API_END_POINT + 'refresh-token', refTokenParams, {withCredentials: true})
    .map((res: Response) => {
      alert("refreshToken-Call");

    });
  }

Согласно приведенному выше коду, когда сервер возвращает код ERR_TKN_EXP, перехватчик проверяет этот код и, соответственно, вызывает функцию для обновления sh токена. Когда я попытался отследить проблему, « refreshToken » предупрежден, но не может видеть окно предупреждения для « refreshToken-Call », что означает, что запрос HTTP http не выполняется.

Кто-нибудь может подсказать, что здесь пошло не так.

Спасибо.

1 Ответ

0 голосов
/ 09 апреля 2020

Метод refreshToken фактически возвращает Observable, но вы не subscribe, поэтому он не запускается.

Измените ваш перехватчик так, чтобы он также передавал возвращаемое значение refreshToken дальше. Angular затем внутренне подпишется на возвращаемое значение перехватчика.

return next.handle(request).pipe(catchError(err => {
  const resError = err.error;

  if (err.status === 401 && resError.error.code == 'ERR_TKN_EXP') {
    return this.authService.refreshToken();
  }

  return EMPTY;
}))
...