useApolloClient

Jaeyeon·2021년 12월 2일
0

코드캠프

목록 보기
18/33

useQuery를 원하는 곳에서 쓰려고 할 때 함수 안에서는 못써서 useApolloClient를 이용.
use Query를 useApolloClient로 바꿔서 쓰는 것.

기존에 만들어둔 로그인 페이지에

const client = useApolloClient 

임포트.

이 client를 앞으로 axios라고 생각.

 //const result = await axios.get("koreanjson.com/posts/1")
    const result = await client.query({
      query: 
    })

여기서 주석의 axios가 client임.

물론 이거 가지고 와야한다

const FETCH_USER_LOGGED_IN = gql`
  query fetchUserLoggedIn {
    fetchUserLoggedIn {
      email
      name
      picture
    }
  }
`;

그리고 방금 갖고온 것을 위의 query: 다음에 쓴다. 아래처럼..

const resultUserInfo = await client.query({
      query: FETCH_USER_LOGGED_IN,
    });

    // const result = fetchUserLoggedIn()
    // setUserInfo(result.data?.fetchUserLoggedIn)
    router.push(`/23-05-login-success`);
  }

글구 가져온 데이터를 setUserInfo로 묶어준다. 글로벌로 쓰기 위함임.

   setUserInfo(resultUserInfo.data.fetchUserLoggedIn)

app.tsx에 이런게 있었음. 우리는 어떤 정보든 뽑아서 쓸 수 있게 된 것.

function MyApp({ Component, pageProps }: AppProps) {
  const [myAccessToken, setMyAccessToken] = useState("");
  const [myUserInfo, setMyUserInfo] = useState({});
  const myValue = {
    accessToken: myAccessToken,
    setMyAccessToken: setMyAccessToken,
    userInfo: myUserInfo,
    setMyUserInfo: setMyUserInfo,
  };

로그인을 받는 페이지는 아래처럼 쓴다.

import { withAuth } from "../../src/components/commons/hocs/withAuth";
import { useContext } from "react";
import { GlobalContext } from "../_app";

function LoginSuccessPage() {
  const { userInfo } = useContext(GlobalContext);

  return (
    <>
      <div>로그인에 성공하였습니다!!!!!</div>
      <div>{userInfo?.name}님 환영합니다!!!</div>
    </>
  );
}
export default withAuth(LoginSuccessPage);

그런데 이것만 갖고는 FETCH_USER_LOGGED_IN이 정상작동하지 않음. 이게 작동하려면 accesstoken을 넘겨줘야 한다. 강제로 넣어줘야 함. client.query 할 때 아래처럼 넣어줘야 한다.

 context:{
        headers:{
          authorization: `Bearer ${result.data?.loginUser.accessToken}`
        }

result 어쩌구가 지저분해서 위에 const로 accessToken을 만들어서 다시 정리하면

const accessToken = result.data?.loginUser.accessToken || "";
    localStorage.setItem("accessToken", accessToken);

    setAccessToken?.(result.data?.loginUser.accessToken || "");
    // 여기서 글로벌 스테이트에 넣을 setAccessToken 필요

    //const result = await axios.get("koreanjson.com/posts/1")

    const resultUserInfo = await client.query({
      query: FETCH_USER_LOGGED_IN,
      context: {
        headers: {
          authorization: `Bearer ${accessToken}`,
        },
      },
    });

내가 오류가 있었는데.. app.tsx에서 setUserInfo를 setMyAccessToken로 저장했었다.
로그인 페이지로 가서 setMyAccessToken로 다시 싹 바꿔줌..

const myValue = {
    accessToken: myAccessToken,
    setMyAccessToken: setMyAccessToken,
    userInfo: myUserInfo,
    setMyUserInfo: setMyUserInfo,
  };


한편 useQuery는 페이지 열리자마자 자동으로 바로 실행, useLazyQuery는 내가 원하는 곳에서 fetchUser를 실행해야지만 {data}에 데이터가 들어오고..실행된다. 근데 얘는 원하는 변수에 못담음.

0개의 댓글

관련 채용 정보