https://facebook.com/groups/graphql-kr logo
#질문
Title
# 질문
x

XiNiHa

01/18/2022, 7:44 AM
Relay를 SSR로 사용 중 페이지 최초 로딩 시에만
Warning: usePreloadedQuery(): Expected preloadedQuery to not be disposed yet.
에러가 발생하는데요, 이거저거 시도해보는데 뭐가 문제인지 제대로 파악을 못 하겠습니다. 혹시 정확한 원인이 뭐고, 어떤 것부터 해결을 시도해보면 될까요?
h

Hyeseong Kim

01/18/2022, 8:23 AM
으음 말그대로 넘긴 쿼리 객체가 GC 당했거나 mark 된걸로 보이네요
사용하신 코드를 같이 남겨주시면 좋ㅇ르거같은데
x

XiNiHa

01/18/2022, 8:43 AM
음 일단 컴퓨터가 앞에 없어서 코드 설명을 쭉 적다가 문득 클라이언트와 서버 각각에서 initialQueryRef를 먹여서 그럴 수도 있겠다는 생각이 들었는데요, 혹시 이게 문제일 수 있을까요? 아니라면 적던 걸 마저 적겠습니다...
일단 적던 걸 마저 적었는데요... •
{ '/': indexQuery }
식으로 각 라우트별 쿼리가 들어 있는 맵이 모듈로 존재합니다. • 먼저 서버에서 이걸 가지고
loadQuery
해서
initialQueryRef
을 얻습니다. • PageShell(최상단 컴포넌트)에서 Provider들을 씌운 후, 바로 안 컴포넌트에서
useQueryLoader
를 사용해 위에서 설명한 맵을 가지고
{ '/': { queryRef, load(), dispose() } }
식의 맵을 만듭니다. 활성화된 라우트의 경우 위에서 만든
initialQueryRef
도 사용합니다. • 현재 활성화된 라우트의 컴포넌트에 해당 라우트의 정보를 가지고
queryRef
을 넘깁니다. • 이후 Suspense 따라 SSR이 진행되고, 최소 대기 딜레이 내에 데이터 페칭이 완료되어 전체가 렌더링된 페이지가 클라이언트로 전송됩니다. • 클라이언트 초기화 코드 실행이 시작됩니다. 서버에서 했듯이 활성 라우트 쿼리의
initialQueryRef
를 불러옵니다. • 이후 서버에서처럼 PageShell을 사용해서 VDOM 노드를 만들고, Hydrate합니다. • 로그로 찍어보면 최초 렌더 시에는
queryRef.isDisposed
가 false로 나오고, 즉시
PreloadedQuery.releaseQuery()
가 호출되며 true로 바뀌고 에러가 납니다. 코드 보고 싶으신 부분 알려주시면 이따가 시간 될 때 코드 올리도록 하겠습니다...
클라이언트와 서버 각각에서 initialQueryRef를 먹여서
일단 테스트해 보니 이 경우는 아니네요… initialQueryRef이 없으면 에러가 나는군요