Aller au contenu principal
Version : 11.x

Lien de réessai

Traduction Bêta Non Officielle

Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →

retryLink est un lien qui vous permet de réessayer les opérations ayant échoué dans votre client tRPC. Il offre une méthode personnalisable pour gérer les erreurs transitoires, telles que les défaillances réseau ou les erreurs serveur, en réessayant automatiquement les requêtes échouées selon des conditions spécifiées.

astuce

Si vous utilisez @trpc/react-query, vous n'aurez généralement pas besoin de ce lien car il est intégré aux hooks useQuery() et useMutation() de @tanstack/react-query.

Utilisation

Vous pouvez importer et ajouter retryLink au tableau links lors de la création de votre client tRPC. Ce lien peut être placé avant ou après d'autres liens dans votre configuration, selon vos besoins.

ts
import { createTRPCClient, httpBatchLink, retryLink } from '@trpc/client';
import type { AppRouter } from './server';
 
const client = createTRPCClient<AppRouter>({
links: [
retryLink({
retry(opts) {
if (
opts.error.data &&
opts.error.data.code !== 'INTERNAL_SERVER_ERROR'
) {
// Don't retry on non-500s
return false;
}
if (opts.op.type !== 'query') {
// Only retry queries
return false;
}
 
// Retry up to 3 times
return opts.attempts <= 3;
},
// Double every attempt, with max of 30 seconds (starting at 1 second)
retryDelayMs: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
}),
httpBatchLink({
url: 'http://localhost:3000',
}),
],
});
ts
import { createTRPCClient, httpBatchLink, retryLink } from '@trpc/client';
import type { AppRouter } from './server';
 
const client = createTRPCClient<AppRouter>({
links: [
retryLink({
retry(opts) {
if (
opts.error.data &&
opts.error.data.code !== 'INTERNAL_SERVER_ERROR'
) {
// Don't retry on non-500s
return false;
}
if (opts.op.type !== 'query') {
// Only retry queries
return false;
}
 
// Retry up to 3 times
return opts.attempts <= 3;
},
// Double every attempt, with max of 30 seconds (starting at 1 second)
retryDelayMs: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
}),
httpBatchLink({
url: 'http://localhost:3000',
}),
],
});

Dans l'exemple ci-dessus, nous ajoutons le retryLink avant le httpBatchLink. La fonction retry est obligatoire et définit quand réessayer. Dans cet exemple, elle va :

  • Réessayer la requête si l'erreur est une TRPCClientError avec un code d'état 500 ou si nous n'avons pas pu obtenir une erreur tRPC valide.

  • Réessaiera la requête jusqu'à 3 fois.

Options

ts
interface RetryLinkOptions<TInferrable extends InferrableClientTypes> {
/**
* The retry function
*/
retry: (opts: RetryFnOptions<TInferrable>) => boolean;
/**
* The delay between retries in ms (defaults to 0)
*/
retryDelayMs?: (attempt: number) => number;
}
 
interface RetryFnOptions<TInferrable extends InferrableClientTypes> {
/**
* The operation that failed
*/
op: Operation;
/**
* The error that occurred
*/
error: TRPCClientError<TInferrable>;
/**
* The number of attempts that have been made (including the first call)
*/
attempts: number;
}
ts
interface RetryLinkOptions<TInferrable extends InferrableClientTypes> {
/**
* The retry function
*/
retry: (opts: RetryFnOptions<TInferrable>) => boolean;
/**
* The delay between retries in ms (defaults to 0)
*/
retryDelayMs?: (attempt: number) => number;
}
 
interface RetryFnOptions<TInferrable extends InferrableClientTypes> {
/**
* The operation that failed
*/
op: Operation;
/**
* The error that occurred
*/
error: TRPCClientError<TInferrable>;
/**
* The number of attempts that have been made (including the first call)
*/
attempts: number;
}

Gestion des événements tracked()

Lors de l'utilisation de retryLink avec des abonnements utilisant tracked(), le lien inclura automatiquement le dernier ID d'événement connu lors du réessai. Cela garantit qu'un abonnement reconnecté peut reprendre là où il s'était arrêté sans manquer d'événements.

Par exemple, si vous utilisez Server-sent Events (SSE) avec httpSubscriptionLink, retryLink gérera automatiquement la reconnexion avec le dernier ID d'événement lors d'erreurs comme 401 Unauthorized.