만료 된 세션에 대한 redux 미들웨어 재시도 기능 생성

발레리 크루 두

내 앱에서는 API 미들웨어를 통해 모든 요청을 실행하고 있습니다. 인증 요청 이 발생하고 만료 된 토큰이 있을 때 미들웨어 재시도 기능을 만들려고합니다 . 내 현재 API 미들웨어는 다음과 같습니다.

const apiMiddleware = ({ dispatch }) => next => action => {
  next(action);
  // creating request data and params

  const retryRequest = () => {
    // refresh tokens with method: dispatch(getTokens());
    // retry initial request
  };

  axios({
    method,
    url,
    headers,
    [dataOrParams]: data,
  })
    .then(({ data: apiData }) => {
      dispatch(onSuccess(apiData));
    })
    .catch(error => {
      if (withToken && error.response.status === 401) {
        retryRequest();
      }
      return dispatch(apiError(label, error));
    })
};

export default apiMiddleware;

retryRequest()메서드를 호출 하면 getTokens()요청이 시작되지만 동시에 초기 요청이 시작되고 Redux는 아직 새 새로 고침 토큰으로 업데이트 getTokens()되지 않았으며 완료되지 않았기 때문에 요청이 다시 실패합니다 .

내가 잘못하고 있다는 것을 이해합니다. 다른 어떤 해결책을 시도 할 수 있습니까? 따라서 첫 번째 요청 getTokens()이 호출되고 완료되면 초기 요청이 계속 될 수 있습니다.

아서 브루 엘

retryRequest () 및 catch 함수를 비동기로 만들 수 있으면 다음을 사용할 수 있습니다.

if(withToken && error.reponse.status === 401)
  await retryRequest();
return dispatch(apiError(label, error));

할 수 없다면 재시도 요청에서 약속을 반환하고

if(withToken && error.response.status === 401)
  return retryRequest().then(_=> dispatch(apiError(label, error)))
return dispatch(apiError(label, error))

axios 인터셉터를 사용할 수도 있습니다. 이것은 제가 가장 최근 프로젝트에서 사용한 것입니다.

api.interceptors.response.use(
  function (response) {
    response.data = parseResponseData(response.data);
    return response;
  },
  async function (error) {
    if (!error.response)
      Ant.message.error('Não foi possivel se conectar com o servidor');
    else if (
      error.response.status === 500 &&
      window.location.pathname !== '/erro/500'
    ) {
      if ((error.config.method as string).toLowerCase() === 'get')
        navigate('/erro/500');
      else
        Ant.message.error(
          'Desculpe, parece que algo deu errado no servidor.',
        );
    } else if (error.response.status === 401) {
      let request = error.config;
      const auth = localStorage.getItem('auth');
      let refreshToken = auth && JSON.parse(auth)['refreshToken'];
      var authService = new AuthService();
      return await authService
        .refresh(refreshToken)
        .then(async (resp) => {
          store.dispatch(login(resp.data));
          let axiosInstance = axios.create();
          intercept(axiosInstance);
          return await axiosInstance.request(request);
        })
        .catch((e) => {
          if (
            window.location.pathname !== '/login' &&
            (!e.response || e.response.status === 401)
          )
            navigate('/login');
        });
    }
    return error.response;
  },
);

지금까지 꽤 잘 작동했습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

구성 가능한 미들웨어로 작성된 Stub isAuthenticated

분류에서Dev

서비스 제공 업체에서 미들웨어로 재정의 된 구성 가져 오기

분류에서Dev

VBA에 대한 일치 및 복사 기능 생성 시도

분류에서Dev

재사용 가능한 React 구성 요소에 대한 Redux 작업 보내기

분류에서Dev

완료된 반응 앱에 대한 스타일이 지정된 URL 만들기

분류에서Dev

VLC / Lua에서 개별적으로 각 미디어 파일에 대한 재생 옵션을 제어하는 재생 목록 만들기

분류에서Dev

하위 기능 내에서 생성 된 노드는 기능이 종료 된 후에도 유효합니까?

분류에서Dev

Tmux에서 "현재 세션 종료"바로 가기 만들기

분류에서Dev

동적으로 생성 된 비디오 태그에 대한 동적 종료 기능

분류에서Dev

Dart에서 Aqueduct에 대한 모든 요청을 처리하는 미들웨어 컨트롤러 만들기

분류에서Dev

버튼 클릭, 루프로 생성 된 버튼에 대한 기능 생성

분류에서Dev

일정 기간 후에 자동으로 만료되는 SJCL에 대한 키를 생성 하시겠습니까?

분류에서Dev

Django 미들웨어, 세션 및 캐싱 시작하기

분류에서Dev

Express의 다음 미들웨어에 대한 속성 유지

분류에서Dev

주어진 덱에서 최대의 고유 한 손 세트를 구성하는 기능 만들기

분류에서Dev

이 재생되기 전에 어떻게 종료 가능한 객체는 적어도 2 가비지 콜렉션주기를한다?

분류에서Dev

프로세스가 종료 된 경우에도 사용자의 현재 세션에 대한 전역 "캐시"를 보장하는 방법

분류에서Dev

현재 페이지를 어떻게 얻습니까? [현재 페이지에 텍스트를 추가하는 간단한 OneNote 추가 기능 생성 시도]

분류에서Dev

커스텀 Redux 미들웨어에서 기다립니다.

분류에서Dev

Linux 커널의 '만료 된'대기열에 실시간 프로세스가 존재할 수 있습니까?

분류에서Dev

asp.net 코어 및 각도 앱에서 만료 된 Azure AD 세션 처리

분류에서Dev

C ++에서 연결된 목록에 대한 복사 생성자 / 함수 만들기

분류에서Dev

ReactDataGrid에서 내 자신의 기본값으로 재사용 가능한 DataGrid 구성 요소를 만들려고 시도했지만 Typescript에서 오류가 발생했습니다.

분류에서Dev

Laravel 5.8 저장 기능 생성에 대한 도움말

분류에서Dev

배열을 만들기 위해 작성된 LINQ에서 관찰 가능한 컬렉션을 만들려면 어떻게해야합니까?

분류에서Dev

재사용 가능한 지시문을 만들기 위해 컨트롤러에서 격리 된 범위 상속

분류에서Dev

RxJS에서 관찰 가능한 '완료된'이벤트 생성

분류에서Dev

가라테 코어에서 재사용 가능한 기능을위한 기능 생성

분류에서Dev

대기 및 종료 (bash)에도 불구하고 무한한 수의 프로세스 생성

Related 관련 기사

  1. 1

    구성 가능한 미들웨어로 작성된 Stub isAuthenticated

  2. 2

    서비스 제공 업체에서 미들웨어로 재정의 된 구성 가져 오기

  3. 3

    VBA에 대한 일치 및 복사 기능 생성 시도

  4. 4

    재사용 가능한 React 구성 요소에 대한 Redux 작업 보내기

  5. 5

    완료된 반응 앱에 대한 스타일이 지정된 URL 만들기

  6. 6

    VLC / Lua에서 개별적으로 각 미디어 파일에 대한 재생 옵션을 제어하는 재생 목록 만들기

  7. 7

    하위 기능 내에서 생성 된 노드는 기능이 종료 된 후에도 유효합니까?

  8. 8

    Tmux에서 "현재 세션 종료"바로 가기 만들기

  9. 9

    동적으로 생성 된 비디오 태그에 대한 동적 종료 기능

  10. 10

    Dart에서 Aqueduct에 대한 모든 요청을 처리하는 미들웨어 컨트롤러 만들기

  11. 11

    버튼 클릭, 루프로 생성 된 버튼에 대한 기능 생성

  12. 12

    일정 기간 후에 자동으로 만료되는 SJCL에 대한 키를 생성 하시겠습니까?

  13. 13

    Django 미들웨어, 세션 및 캐싱 시작하기

  14. 14

    Express의 다음 미들웨어에 대한 속성 유지

  15. 15

    주어진 덱에서 최대의 고유 한 손 세트를 구성하는 기능 만들기

  16. 16

    이 재생되기 전에 어떻게 종료 가능한 객체는 적어도 2 가비지 콜렉션주기를한다?

  17. 17

    프로세스가 종료 된 경우에도 사용자의 현재 세션에 대한 전역 "캐시"를 보장하는 방법

  18. 18

    현재 페이지를 어떻게 얻습니까? [현재 페이지에 텍스트를 추가하는 간단한 OneNote 추가 기능 생성 시도]

  19. 19

    커스텀 Redux 미들웨어에서 기다립니다.

  20. 20

    Linux 커널의 '만료 된'대기열에 실시간 프로세스가 존재할 수 있습니까?

  21. 21

    asp.net 코어 및 각도 앱에서 만료 된 Azure AD 세션 처리

  22. 22

    C ++에서 연결된 목록에 대한 복사 생성자 / 함수 만들기

  23. 23

    ReactDataGrid에서 내 자신의 기본값으로 재사용 가능한 DataGrid 구성 요소를 만들려고 시도했지만 Typescript에서 오류가 발생했습니다.

  24. 24

    Laravel 5.8 저장 기능 생성에 대한 도움말

  25. 25

    배열을 만들기 위해 작성된 LINQ에서 관찰 가능한 컬렉션을 만들려면 어떻게해야합니까?

  26. 26

    재사용 가능한 지시문을 만들기 위해 컨트롤러에서 격리 된 범위 상속

  27. 27

    RxJS에서 관찰 가능한 '완료된'이벤트 생성

  28. 28

    가라테 코어에서 재사용 가능한 기능을위한 기능 생성

  29. 29

    대기 및 종료 (bash)에도 불구하고 무한한 수의 프로세스 생성

뜨겁다태그

보관