Skip to content

Commit 6fcfc9b

Browse files
authored
feat: no retries on the server (#5802)
* feat: zero retries on the server * test: no retry on the server * docs: no retry on the server
1 parent 251fb6f commit 6fcfc9b

File tree

5 files changed

+31
-2
lines changed

5 files changed

+31
-2
lines changed

docs/react/guides/migrating-to-v5.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,10 @@ useInfiniteQuery({
341341

342342
Previously, we've allowed to overwrite the `pageParams` that would be returned from `getNextPageParam` or `getPreviousPageParam` by passing a `pageParam` value directly to `fetchNextPage` or `fetchPreviousPage`. This feature didn't work at all with refetches and wasn't widely known or used. This also means that `getNextPageParam` is now required for infinite queries.
343343

344+
### No retries on the server
345+
346+
On the server, `retry` now defaults to `0` instead of `3`. For prefetching, we have always defaulted to `0` retries, but since queries that have `suspense` enabled can now execute directly on the server as well (since React18), we have to make sure that we don't retry on the server at all.
347+
344348
[//]: # 'FrameworkBreakingChanges'
345349

346350
## React Query Breaking Changes

docs/react/guides/query-retries.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ You can configure retries both on a global level and an individual query level.
1212
- Setting `retry = true` will infinitely retry failing requests.
1313
- Setting `retry = (failureCount, error) => ...` allows for custom logic based on why the request failed.
1414

15+
> On the server, retries default to `0` to make server rendering as fast as possible.
16+
1517
[//]: # 'Example'
1618

1719
```tsx

docs/react/reference/useQuery.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ const {
7979
- If `false`, failed queries will not retry by default.
8080
- If `true`, failed queries will retry infinitely.
8181
- If set to a `number`, e.g. `3`, failed queries will retry until the failed query count meets that number.
82+
- defaults to `3` on the client and `0` on the server
8283
- `retryOnMount: boolean`
8384
- If set to `false`, the query will not be retried on mount if it contains an error. Defaults to `true`.
8485
- `retryDelay: number | (retryAttempt: number, error: TError) => number`

packages/query-core/src/retryer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { focusManager } from './focusManager'
22
import { onlineManager } from './onlineManager'
3-
import { sleep } from './utils'
3+
import { isServer, sleep } from './utils'
44
import type { CancelOptions, DefaultError, NetworkMode } from './types'
55

66
// TYPES
@@ -158,7 +158,7 @@ export function createRetryer<TData = unknown, TError = DefaultError>(
158158
}
159159

160160
// Do we need to retry the request?
161-
const retry = config.retry ?? 3
161+
const retry = config.retry ?? (isServer ? 0 : 3)
162162
const retryDelay = config.retryDelay ?? defaultRetryDelay
163163
const delay =
164164
typeof retryDelay === 'function'

packages/query-core/src/tests/query.test.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
createQueryClient,
66
mockVisibilityState,
77
queryKey,
8+
setIsServer,
89
sleep,
910
} from './utils'
1011
import type {
@@ -804,6 +805,27 @@ describe('query', () => {
804805
consoleMock.mockRestore()
805806
})
806807

808+
it('should not retry on the server', async () => {
809+
const resetIsServer = setIsServer(true)
810+
811+
const key = queryKey()
812+
let count = 0
813+
814+
const observer = new QueryObserver(queryClient, {
815+
queryKey: key,
816+
queryFn: () => {
817+
count++
818+
return Promise.reject(new Error('error'))
819+
},
820+
})
821+
822+
await observer.refetch()
823+
824+
expect(count).toBe(1)
825+
826+
resetIsServer()
827+
})
828+
807829
test('constructor should call initialDataUpdatedAt if defined as a function', async () => {
808830
const key = queryKey()
809831

0 commit comments

Comments
 (0)