inflearn logo
강의

Khóa học

Chia sẻ kiến thức

[CodeCamp] Khóa học Front-end cô đặc được tạo ra từ Bootcamp

30-01-login-refreshtoken / login-refreshtoken-success

newAccessToken 이 바로 적용되지 않습니다

429

kyb1208tg

21 câu hỏi đã được viết

0

  const errorLink = onError(({ graphQLErrors, operation, forward }) => {
    //1. 에러 캐치
    if (typeof graphQLErrors !== "undefined") {
      for (const err of graphQLErrors) {
        //1-2. 해당 에러가 토큰만료 에러인지 체크
        if (err.extensions.code === "UNAUTHENTICATED") {
          return fromPromise(
            //2. refreshtoken으로 accessToken을 재발급 받기
            getAccessToken().then((newAccessToken) => {
              setAccessToken(newAccessToken ?? "");
              //3. 재발급 받은 accesstoken 으로 방금 실패한 쿼리 실행하기
              operation.setContext({
                header: {
                  ...operation.getContext().headers, //기존의 authorization: Bearer '만료된 토큰'
                  Authorization: `Bearer ${newAccessToken}`, //3-2 authorization 만 바꿔치기
                },
              });
            })
          ).flatMap(() => forward(operation)); //3-3 방금 수정한 쿼리 재요청하기
        }
      }
    }
  });

수업이랑 동일하게 코드를 작성하였으나 버튼을 눌러도 재발급된 accessToken 이 들어가지 않아 error 가 발생하고 2번이상 눌러야지만 accesstoken 이 제대로 수정되서 정상적으로 실행됩니다. 어디가 문제일까요?

react node.js seo graphql next.js

Câu trả lời 3

0

kyb1208tg

export const getAccessToken = async (): Promise<string | undefined> => {
  try {
    const graphQlClient = new GraphQLClient(
      "https://backend-practice.codebootcamp.co.kr/graphql",
      { credentials: "include" } // cookie 에 data를 저장하기 위한 설정
    );
    const result = await graphQlClient.request<
      Pick<IMutation, "restoreAccessToken">
    >(RESTORE_ACCESS_TOKEN);
    const newAccessToken = result?.restoreAccessToken.accessToken;

    console.log(newAccessToken);
    return newAccessToken;
  } catch (error) {
    if (error instanceof Error) {
      console.log(error.message);
    }
  }
};

getAccessToken 도 제대로 작성된거 같은데 윗방식대로 작성해야 되는걸까요?

0

nwd09074926

안녕하세요! kyb1208tg님!

위 코드를 보면, 수업의 내용과 크게 다른 것이 없이 잘 작성하신 것 같아요!

따라서, getAccessToken() 파트의 코드를 한 번 점검해 보실 필요가 있을 것 같아요!

0

communityai8509

안녕하세요, 인프런 AI 인턴이에요.

버튼을 눌러도 재발급된 accessToken이 바로 적용되지 않는 문제가 발생하는군요. 이 문제의 원인은 아마 비동기적으로 실행되는 코드 때문일 것으로 추측됩니다. getAccessToken() 함수는 비동기로 동작하며, 그 결과값이 반환되기 전에 다음 코드가 실행되기 때문에 accessToken이 바로 적용되지 않는 것입니다. 이 때문에 에러가 발생하고, 2번 이상의 버튼 클릭이 필요한 것 같습니다.

해결 방법으로는 getAccessToken().then() 메소드 블록 내에서 operation.setContext()를 호출하고, forward(operation)을 반환하는 대신 forward(operation).flatMap(() => ...)을 사용하여 프로미스 체인을 연결해 보세요. 이렇게 하면 getAccessToken() 함수의 결과가 반영된 후에만 다음 코드가 실행됩니다.

다음은 수정된 코드입니다:

const errorLink = onError(({ graphQLErrors, operation, forward }) => {
  if (typeof graphQLErrors !== "undefined") {
    for (const err of graphQLErrors) {
      if (err.extensions.code === "UNAUTHENTICATED") {
        return fromPromise(
          getAccessToken().then((newAccessToken) => {
            setAccessToken(newAccessToken ?? "");
            operation.setContext({
              header: {
                ...operation.getContext().headers,
                Authorization: `Bearer ${newAccessToken}`,
              },
            });
            return forward(operation).flatMap((response) => {
              if (response.errors) {
                throw new Error("GraphQL Error");
              }
              return response;
            });
          })
        );
      }
    }
  }
});

위의 코드를 사용하여 한 번 시도해 보시고, 문제가 해결되었는지 확인해 주세요. 추가 도움이 필요하시면 언제든지 말씀해 주세요. 감사합니다.

fetchBoardsOfMine, fetchBoardsCountOfMine 에러 문의드립니다

0

34

1

댓글 기능 구현 중 질문드립니다.

0

65

1

쿠폰코드 발급

0

128

2

example 서버 플레이그라운드, API 접속 모두 안됩니다.

0

86

2

문의드립니다!! ㅠㅠ

0

101

2

graphql 백엔드 서버가 포폴용 빼곤 접속이 안됩니다.

0

76

2

_app.js 작성 이후로 에러가 발생하네요

0

93

2

학습자료

0

69

2

학습자료가 안열립니다.

0

48

2

플레이 그라운드 퀴즈 문제 질문이 있습니다.

0

59

0

기존강의 구매자, 업데이트 끝인가요?

0

108

3

업데이트 버전 수강

0

88

2

완벽한 프론트엔드

0

136

2

나만의 쇼핑몰 샘플 페이지 접속 확인부탁드립니다.

0

81

1

graphql 접속이 안됩니다.

0

100

2

const, let 사용 질문 드립니다.

0

70

2

싸이월드 만들기 1탄 피드백 부탁드립니다.

0

122

2

회원가입 과제 피드백 부탁드립니다.

0

79

2

styled.span / styled.input "CSS 자동완성"

0

47

1

쿠폰 발급 관련

0

166

2

서버 502 error

0

246

2

쿠폰 다시 부탁드려도 될가여?

0

140

2

a태그 패딩했을때 왜 크기가 줄어들지 않고 늘어나나요

0

182

2

2분 44초 질문

0

128

3