Hoppa till huvudinnehållet
Version: 11.x

Försök igen-länk

Inofficiell Beta-översättning

Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →

retryLink är en länk som låter dig försöka igen med misslyckade operationer i din tRPC-klient. Den ger ett anpassningsbart sätt att hantera tillfälliga fel, som nätverksproblem eller serverfel, genom att automatiskt försöka utföra de misslyckade förfrågningarna igen baserat på angivna villkor.

tips

Om du använder @trpc/react-query behöver du generellt sett inte den här länken eftersom den är inbyggd i useQuery()- och useMutation()-hookarna från @tanstack/react-query.

Användning

Du kan importera och lägga till retryLink i links-arrayen när du skapar din tRPC-klient. Den här länken kan placeras före eller efter andra länkar i din konfiguration, beroende på dina behov.

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',
}),
],
});

I exemplet ovan lägger vi till retryLink före httpBatchLink. Som standard kommer retryLink att:

  • Försöka utföra förfrågan igen om felet är en TRPCClientError med statuskod 500 eller om vi inte kunde få ett giltigt TRPC-fel.

  • Försöka utföra förfrågan igen upp till 3 gånger.

Du kan anpassa logiken för att försöka igen genom att tillhandahålla en anpassad retry-funktion.

Alternativ

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;
}

Hantering av tracked()-händelser

När du använder retryLink med prenumerationer som använder tracked() kommer länken automatiskt att inkludera det senast kända händelse-ID:t vid nya försök. Detta säkerställer att när en prenumeration återansluter kan den fortsätta från där den slutade utan att missa några händelser.

Till exempel, om du använder Server-sent Events (SSE) med httpSubscriptionLink, kommer retryLink automatiskt att hantera omanslutning med det senaste händelse-ID:t när fel som 401 Unauthorized uppstår.