HTTP Batch Stream-länk
Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →
httpBatchStreamLink är en terminerande länk som samlar en array av individuella tRPC-operationer till en enda HTTP-förfrågan som skickas till en enskild tRPC-procedur (motsvarande httpBatchLink), men väntar inte på att alla svar i batchen ska bli klara utan streamar svaren så fort någon data blir tillgänglig.
Alternativ
Alternativen är identiska med httpBatchLink options, med följande tillägg:
| Option | Type | Default | Description |
|---|---|---|---|
streamHeader | 'trpc-accept' | 'accept' | 'trpc-accept' | Which header to use to signal the server that the client wants a streaming response. 'accept' uses the standard Accept header instead of the custom trpc-accept header, which can avoid CORS preflight for cross-origin streaming queries since Accept is a CORS-safelisted header. |
Användning
All användning och alternativ är identiska med
httpBatchLink.
Om du behöver möjlighet att ändra/sätta svarshuvuden (inklusive cookies) från dina procedurer, se till att använda httpBatchLink istället! Detta beror på att httpBatchStreamLink inte stöder att sätta headers efter att strömmen har börjat. Läs mer.
Du kan importera och lägga till httpBatchStreamLink i links-arrayen så här:
client/index.tstsimport {createTRPCClient ,httpBatchStreamLink } from '@trpc/client';import type {AppRouter } from './server';constclient =createTRPCClient <AppRouter >({links : [httpBatchStreamLink ({url : 'http://localhost:3000',}),],});
client/index.tstsimport {createTRPCClient ,httpBatchStreamLink } from '@trpc/client';import type {AppRouter } from './server';constclient =createTRPCClient <AppRouter >({links : [httpBatchStreamLink ({url : 'http://localhost:3000',}),],});
Efter detta kan du utnyttja batchhantering genom att placera alla dina procedurer i ett Promise.all. Koden nedan genererar exakt en HTTP-förfrågan och på servern exakt en databasfråga:
tsconstsomePosts = awaitPromise .all ([trpc .post .byId .query (1),trpc .post .byId .query (2),trpc .post .byId .query (3),]);
tsconstsomePosts = awaitPromise .all ([trpc .post .byId .query (1),trpc .post .byId .query (2),trpc .post .byId .query (3),]);
Strömläge
När förfrågningar batchas väntar en vanlig httpBatchLink på att alla förfrågningar ska slutföras innan svaret skickas. Om du vill skicka svar så fort de blir klara kan du använda httpBatchStreamLink istället. Detta är användbart för långvariga förfrågningar.
client/index.tstsimport {createTRPCClient ,httpBatchStreamLink } from '@trpc/client';import type {AppRouter } from './server';constclient =createTRPCClient <AppRouter >({links : [httpBatchStreamLink ({url : 'http://localhost:3000',}),],});
client/index.tstsimport {createTRPCClient ,httpBatchStreamLink } from '@trpc/client';import type {AppRouter } from './server';constclient =createTRPCClient <AppRouter >({links : [httpBatchStreamLink ({url : 'http://localhost:3000',}),],});
Jämfört med en vanlig httpBatchLink kommer en httpBatchStreamLink att:
-
Orsakar att förfrågningar skickas med ett
trpc-accept: application/jsonl-header (ellerAccept: application/jsonlvid användning avstreamHeader: 'accept') -
Skicka svaret med
transfer-encoding: chunkedochcontent-type: application/jsonl -
Ta bort
data-nyckeln från argumentobjektet som skickas tillresponseMeta(eftersom headers skickas före datan är tillgänglig i ett streamat svar)
Asynkrona generatorer och uppskjutna promises
Du kan prova detta på tRPC.io:s hemsida: https://trpc.io/?try=minimal#try-it-out
tsimport {createTRPCClien t,httpB atchStreamLink } from '@trpc/client';import type { AppRouter } from './server';const trpc = createTRPCClient<AppRouter>({links: [httpBatchStreamLink({ url:'http ://localh ost:3000',}),],});const iterable = await trpc.examples.iterable.query();for await (const value of iterable) {console.log('Iterable:', value);}
tsimport {createTRPCClien t,httpB atchStreamLink } from '@trpc/client';import type { AppRouter } from './server';const trpc = createTRPCClient<AppRouter>({links: [httpBatchStreamLink({ url:'http ://localh ost:3000',}),],});const iterable = await trpc.examples.iterable.query();for await (const value of iterable) {console.log('Iterable:', value);}
Kompatibilitet (klientsida)
Webbläsare
Stödet i webbläsare bör vara identiskt med fetch-stödet.
Node.js / Deno
För runtime-miljöer utöver webbläsare måste fetch-implementationen stödja streaming, vilket innebär att svaret från await fetch(...) ska ha en body-egenskap av typen ReadableStream<Uint8Array> | NodeJS.ReadableStream, vilket betyder att:
-
antingen är
response.body.getReaderen funktion som returnerar ettReadableStreamDefaultReader<Uint8Array>-objekt -
eller så är
response.bodyenUint8Array-Buffer
Detta inkluderar stöd för undici, node-fetch, Node.js:s inbyggda fetch-implementation och WebAPI:s fetch-implementation (webbläsare).
React Native
Mottagande av strömmen förlitar sig på TextDecoder- och TextDecoderStream-API:erna, som inte finns tillgängliga i React Native. Observera att om din TextDecoderStream-polyfill inte automatiskt polyfyller ReadableStream och WritableStream måste även dessa polyfyllas. Om du fortfarande vill aktivera streaming måste du polyfyllera dessa.
Du måste även åsidosätta standard-fetch i httpBatchStreamLink-konfigurationsalternativen. I exemplet nedan använder vi Expo fetch-paketet som fetch-implementation.
tsimport { httpBatchStreamLink } from '@trpc/client';httpBatchStreamLink({fetch: (url, opts) =>fetch(url, {...opts,reactNative: { textStreaming: true },}),url: 'http://localhost:3000',});
tsimport { httpBatchStreamLink } from '@trpc/client';httpBatchStreamLink({fetch: (url, opts) =>fetch(url, {...opts,reactNative: { textStreaming: true },}),url: 'http://localhost:3000',});
Kompatibilitet (serversida)
httpBatchStreamLink stöds endast på AWS Lambda när din infrastruktur är konfigurerad för strömmade svar. Annars kommer denna länk att bete sig som en vanlig httpBatchLink.
Du måste aktivera ReadableStream-API:et via en feature flag: streams_enable_constructors.
Referens
Du kan se källkoden för denna länk på GitHub.
Konfigurera ett ping-alternativ för att hålla anslutningen vid liv
När du konfigurerar din rotkonfiguration kan du skicka med ett jsonl-alternativ för att ställa in ett ping-alternativ som håller anslutningen vid liv.
tsimport {initTRPC } from '@trpc/server';constt =initTRPC .create ({jsonl : {pingMs : 1000,},});
tsimport {initTRPC } from '@trpc/server';constt =initTRPC .create ({jsonl : {pingMs : 1000,},});