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, retryLink } from '@trpc/client';
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, retryLink } from '@trpc/client';
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 retryLink avant httpBatchLink. Par défaut, retryLink :

  • Réessaiera 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.

Vous pouvez personnaliser la logique de réessai en fournissant une fonction retry personnalisée.

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.