relay-nextjs icon indicating copy to clipboard operation
relay-nextjs copied to clipboard

"Expected preloadedQuery to not be disposed yet." error

Open solher opened this issue 3 years ago • 7 comments

First of all, thank you for the library 🙏

For one of my component, I'm using the useQueryLoader + usePreloadedQuery hooks.

Everything was working flawlessly until I updated from React 17.0.2 to 18.1.0. I started getting:

next-dev.js?3515:25 Warning: usePreloadedQuery(): Expected preloadedQuery to not be disposed yet. This is because disposing the query marks it for future garbage collection, and as such query results may no longer be present in the Relay store. In the future, this will become a hard error. 
    at eval (webpack-internal:///./components/index/UserBeats.tsx:22:26)
    at LoadableImpl (webpack-internal:///./node_modules/next/dist/shared/lib/loadable.js:101:38)
    at Suspense
    at eval (webpack-internal:///./components/index/IndexLoggedIn.tsx:120:69)
    at LoadableImpl (webpack-internal:///./node_modules/next/dist/shared/lib/loadable.js:101:38)
    at Suspense
    at eval (webpack-internal:///./pages/index.tsx:45:73)
    at div
    at div
    at eval (webpack-internal:///./components/nav/NavWeb.tsx:50:27)
    at RelayEnvironmentProvider (webpack-internal:///./node_modules/react-relay/lib/relay-hooks/RelayEnvironmentProvider.js:21:24)
    at FirebaseContextProvider (webpack-internal:///./lib/firebase.tsx:125:29)
    at MyApp (webpack-internal:///./pages/_app.tsx:112:27)
    at ErrorBoundary (webpack-internal:///./node_modules/next/dist/compiled/@next/react-dev-overlay/client.js:8:20746)
    at ReactDevOverlay (webpack-internal:///./node_modules/next/dist/compiled/@next/react-dev-overlay/client.js:8:23395)
    at Container (webpack-internal:///./node_modules/next/dist/client/index.js:323:9)
    at AppContainer (webpack-internal:///./node_modules/next/dist/client/index.js:825:26)
    at Root (webpack-internal:///./node_modules/next/dist/client/index.js:949:27)

It's not crashing or anything, it's just a warning and it actually disappears when going to prod, but I was wondering if it would ring a bell to you. I really cannot find anything online :/

solher avatar Jun 11 '22 12:06 solher

I haven't seen this error in production mode at all, only sometimes in dev when interrupting the loading process. That said, we're still on React 17 at Revere so it makes sense. I'll try upgrading soon and update here!

rrdelaney avatar Jun 12 '22 20:06 rrdelaney

If you are using strict mode react renders the component twice. If you use an effect to dispose of your query you might get this error. In that case in your effect fetch the preload the query again.

  useEffect(() => {
    if (_data.isDisposed) revalidate(); // this function preloads the query again

    return () => _data.dispose();
  }, []);

phikes avatar Apr 16 '23 12:04 phikes

We have this issue too since we started using React 18 with strict mode.

@phikes thanks for your input, a quick search in this codebase highlighted this piece of code:

https://github.com/RevereCRE/relay-nextjs/blob/d9ad8aafba17ec8bc61f4bc054e892b6bfbe9b1f/relay-nextjs/src/wired/component.tsx#L114-L117

Would this be the cause? the <Component child would receive a disposed reference to preloadedQuery when react strict mode renders twice.

however the effect that disposes the query on unmount also calls load on mount, so I am not sure if the issue comes from here.

fazo96 avatar May 11 '23 12:05 fazo96

I am not sure, I actually just stumbled across this issue. I had the same problem with another stack. But this looks very much like the culprit to me, yes. It looks more like a "real" race condition here.

phikes avatar May 11 '23 13:05 phikes

We have a new version we've been testing internally that replaces this code path I'll work on releasing soon!

rrdelaney avatar May 11 '23 16:05 rrdelaney

@rrdelaney Any update on this issue?

jasonaden avatar Jul 20 '23 16:07 jasonaden

@rrdelaney Any update on this issue?

Hey Jason, we've removed that exact codepath in 2.0. Are you continuing to see the issue after upgrading?

rrdelaney avatar Jul 20 '23 18:07 rrdelaney