Översikt över länkar
Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →
Länkar låter dig anpassa dataflödet mellan tRPC-klienten och servern. En länk ska bara göra en sak, antingen en självständig modifiering av en tRPC-operation (query, mutation eller subscription) eller en bieffekt baserad på operationen (som loggning).
Du kan sammansätta länkar till en array som du anger i tRPC-klientkonfigurationen via egenskapen links. Denna array representerar en länkkedja. Det innebär att tRPC-klienten kommer att köra länkarna i den ordning de läggs till i links-arrayen när en begäran görs, och köra dem i omvänd ordning när den hanterar ett svar. Här är en visuell representation av länkkedjan:
Exemplen nedan förutsätter att du använder Next.js, men samma sak kan läggas till om du använder den vanliga tRPC-klienten
utils/trpc.tstsximport { httpBatchLink, loggerLink } from '@trpc/client';import { createTRPCNext } from '@trpc/next';export default createTRPCNext<AppRouter>({config() {const url = `http://localhost:3000`;return {links: [loggerLink(),httpBatchLink({url,}),],};},});
utils/trpc.tstsximport { httpBatchLink, loggerLink } from '@trpc/client';import { createTRPCNext } from '@trpc/next';export default createTRPCNext<AppRouter>({config() {const url = `http://localhost:3000`;return {links: [loggerLink(),httpBatchLink({url,}),],};},});
Skapa en anpassad länk
En länk är en funktion som följer typen TRPCLink. Varje länk består av tre delar:
-
Länken returnerar en funktion som har en parameter av typen
TRPCClientRuntime. Detta argument skickas av tRPC och används när man skapar en terminerande länk. Om du inte skapar en terminerande länk kan du skapa en funktion utan parametrar. I så fall ska länken läggas till ilinks-arrayen utan anrop (links: [..., myLink, httpBatchLink(...)]). -
Funktionen i steg 1 returnerar en annan funktion som tar emot ett objekt med två egenskaper:
opsom ärOperationsom körs av klienten, ochnextsom är funktionen vi använder för att anropa nästa länk i kedjan. -
Funktionen i steg 2 returnerar en slutlig funktion som returnerar
observable-funktionen från@trpc/server.observabletar emot en funktion som får enobserversom hjälper vår länk att meddela nästa länk uppåt i kedjan hur de ska hantera operationsresultatet. I denna funktion kan vi returneranext(op)och lämna det som det är, eller så kan vi prenumerera pånext, vilket gör att vår länk kan hantera operationsresultatet.
Exempel
utils/customLink.tstsximport { TRPCLink } from '@trpc/client';import { observable } from '@trpc/server/observable';import type { AppRouter } from '~/server/routers/_app';export const customLink: TRPCLink<AppRouter> = () => {// here we just got initialized in the app - this happens once per app// useful for storing cache for instancereturn ({ next, op }) => {// this is when passing the result to the next link// each link needs to return an observable which propagates resultsreturn observable((observer) => {console.log('performing operation:', op);const unsubscribe = next(op).subscribe({next(value) {console.log('we received value', value);observer.next(value);},error(err) {console.log('we received error', err);observer.error(err);},complete() {observer.complete();},});return unsubscribe;});};};
utils/customLink.tstsximport { TRPCLink } from '@trpc/client';import { observable } from '@trpc/server/observable';import type { AppRouter } from '~/server/routers/_app';export const customLink: TRPCLink<AppRouter> = () => {// here we just got initialized in the app - this happens once per app// useful for storing cache for instancereturn ({ next, op }) => {// this is when passing the result to the next link// each link needs to return an observable which propagates resultsreturn observable((observer) => {console.log('performing operation:', op);const unsubscribe = next(op).subscribe({next(value) {console.log('we received value', value);observer.next(value);},error(err) {console.log('we received error', err);observer.error(err);},complete() {observer.complete();},});return unsubscribe;});};};
Referenser
Om du behöver ett mer verkligt exempel för att skapa din anpassade länk kan du titta på några av tRPC:s inbyggda länkar på GitHub.
Den terminerande länken
Den terminerande länken är den sista länken i en länkkedja. Istället för att anropa next-funktionen är den terminerande länken ansvarig för att skicka din sammansatta tRPC-operation till tRPC-servern och returnera ett OperationResultEnvelope.
links-arrayen som du lägger till i tRPC-klientkonfigurationen måste innehålla minst en länk, och den länken ska vara en terminerande länk. Om links inte har en terminerande länk i slutet kommer tRPC-operationen inte att skickas till tRPC-servern.
httpBatchLink är den rekommenderade terminerande länken i tRPC.
httpLink, wsLink och localLink är andra exempel på terminerande länkar.
Hantera kontext
När en operation rör sig längs din länkkedja behåller den en kontext som varje länk kan läsa och modifiera. Detta låter länkar skicka metadata längs kedjan som andra länkar använder i sin exekveringslogik.
Få det aktuella kontextobjektet och modifiera det genom att komma åt op.context.
Du kan ange kontextobjektets initialvärde för en specifik operation genom att ange kontextparametern till query eller useQuery-hooken (eller mutation, subscription, etc.).
För ett exempel på användning, se Inaktivera batchhantering för specifika förfrågningar.