From 629271cbe002bd2f2792b12c84a14de0804161ab Mon Sep 17 00:00:00 2001 From: alex-js-ltd Date: Wed, 26 Aug 2026 10:47:19 +0100 Subject: [PATCH 1/4] test(react-query): cover falsy errors with throwOnError in useQuery --- .../src/__tests__/useQuery.test.tsx | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/react-query/src/__tests__/useQuery.test.tsx b/packages/react-query/src/__tests__/useQuery.test.tsx index 702d9a3ca4..520e80fc67 100644 --- a/packages/react-query/src/__tests__/useQuery.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.test.tsx @@ -2773,6 +2773,35 @@ describe('useQuery', () => { consoleMock.mockRestore() }) + it('should throw error if queryFn rejects with a falsy error and throwOnError is in use', async () => { + const consoleMock = vi + .spyOn(console, 'error') + .mockImplementation(() => undefined) + const key = queryKey() + + function Page() { + const { status } = useQuery({ + queryKey: key, + queryFn: () => Promise.reject(), + retry: false, + throwOnError: true, + }) + + return

{status}

+ } + + const rendered = renderWithClient( + queryClient, +
error boundary
}> + +
, + ) + + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByText('error boundary')).toBeInTheDocument() + consoleMock.mockRestore() + }) + it('should update with data if we observe no properties and throwOnError', async () => { const key = queryKey() From 42235e7b277b11a47b95fc711fd76b3aaaa1914a Mon Sep 17 00:00:00 2001 From: alex-js-ltd Date: Wed, 26 Aug 2026 11:06:23 +0100 Subject: [PATCH 2/4] test(react-query): show falsy errors silently skip the error boundary --- .../src/__tests__/useQueries.test.tsx | 33 +++++++++++++++++ .../src/__tests__/useSuspenseQueries.test.tsx | 36 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/packages/react-query/src/__tests__/useQueries.test.tsx b/packages/react-query/src/__tests__/useQueries.test.tsx index ca5e525180..4dceb12c21 100644 --- a/packages/react-query/src/__tests__/useQueries.test.tsx +++ b/packages/react-query/src/__tests__/useQueries.test.tsx @@ -273,6 +273,39 @@ describe('useQueries', () => { consoleMock.mockRestore() }) + it("should throw error if in one of queries' queryFn rejects with a falsy error and throwOnError is in use", async () => { + const consoleMock = vi + .spyOn(console, 'error') + .mockImplementation(() => undefined) + const key = queryKey() + + function Page() { + useQueries({ + queries: [ + { + queryKey: key, + queryFn: () => Promise.reject(), + retry: false, + throwOnError: true, + }, + ], + }) + + return null + } + + const rendered = renderWithClient( + queryClient, +
error boundary
}> + +
, + ) + + await vi.advanceTimersByTimeAsync(0) + expect(rendered.getByText('error boundary')).toBeInTheDocument() + consoleMock.mockRestore() + }) + it('should use provided custom queryClient', async () => { const key = queryKey() const queryFn = async () => { diff --git a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx index eef3bdcc13..f8bbb63a98 100644 --- a/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQueries.test.tsx @@ -577,6 +577,42 @@ describe('useSuspenseQueries', () => { expect(rendered.getByText('Data 1')).toBeInTheDocument() }) + it('should throw error when a queryFn rejects with a falsy error', async () => { + const consoleMock = vi + .spyOn(console, 'error') + .mockImplementation(() => undefined) + const key = queryKey() + + function Page() { + const [query] = useSuspenseQueries({ + queries: [ + { + queryKey: key, + queryFn: () => sleep(10).then(() => Promise.reject()), + retry: false, + }, + ], + }) + + return
data: {String(query.data)}
+ } + + const rendered = renderWithClient( + queryClient, +
error boundary
}> + + + +
, + ) + + expect(rendered.getByText('loading')).toBeInTheDocument() + + await act(() => vi.advanceTimersByTimeAsync(10)) + expect(rendered.getByText('error boundary')).toBeInTheDocument() + consoleMock.mockRestore() + }) + it('should throw error when queryKey changes and new query fails', async () => { const consoleMock = vi .spyOn(console, 'error') From eeb2d1805d49d562685a9b4dfa2cfad8cb1bd360 Mon Sep 17 00:00:00 2001 From: alex-js-ltd Date: Wed, 26 Aug 2026 12:01:40 +0100 Subject: [PATCH 3/4] fix(react-query): throw falsy errors from useQueries to the error boundary --- packages/react-query/src/useQueries.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-query/src/useQueries.ts b/packages/react-query/src/useQueries.ts index 437718a988..5b0a84f436 100644 --- a/packages/react-query/src/useQueries.ts +++ b/packages/react-query/src/useQueries.ts @@ -323,7 +323,7 @@ export function useQueries< }, ) - if (firstSingleResultWhichShouldThrow?.error) { + if (firstSingleResultWhichShouldThrow) { throw firstSingleResultWhichShouldThrow.error } From fc00bf49b2618f0b818a02c0233df7f0dacf8eb3 Mon Sep 17 00:00:00 2001 From: alex-js-ltd Date: Wed, 26 Aug 2026 12:05:36 +0100 Subject: [PATCH 4/4] chore: add changeset --- .changeset/olive-donuts-shave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/olive-donuts-shave.md diff --git a/.changeset/olive-donuts-shave.md b/.changeset/olive-donuts-shave.md new file mode 100644 index 0000000000..66ec68812d --- /dev/null +++ b/.changeset/olive-donuts-shave.md @@ -0,0 +1,5 @@ +--- +'@tanstack/react-query': patch +--- + +fix(react-query): throw falsy errors from `useQueries` and `useSuspenseQueries` to the error boundary