HTTPバッチリンク
非公式ベータ版翻訳
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
httpBatchLinkは終端リンクの一種で、複数のtRPC操作を単一のHTTPリクエストにまとめ、1つのtRPCプロシージャに送信します。
使用方法
httpBatchLinkをインポートしてlinks配列に次のように追加します:
client/index.tstsimport {createTRPCClient ,httpBatchLink } from '@trpc/client';import type {AppRouter } from './server';constclient =createTRPCClient <AppRouter >({links : [httpBatchLink ({url : 'http://localhost:3000',// transformer,}),],});
client/index.tstsimport {createTRPCClient ,httpBatchLink } from '@trpc/client';import type {AppRouter } from './server';constclient =createTRPCClient <AppRouter >({links : [httpBatchLink ({url : 'http://localhost:3000',// transformer,}),],});
その後、すべてのプロシージャをPromise.allで設定することでバッチ処理を活用できます。以下のコードは単一のHTTPリクエストを生成し、サーバー側では単一のデータベースクエリを実行します:
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),]);
httpBatchLinkのオプション
httpBatchLink関数はHTTPBatchLinkOptions形式のオプションオブジェクトを受け取ります。
tsexport interfaceHTTPBatchLinkOptions extendsHTTPLinkOptions {/*** Maximum length of HTTP URL allowed before operations are split into multiple requests* @default Infinity*/maxURLLength ?: number;/*** Maximum number of operations allowed in a single batch request* @default Infinity*/maxItems ?: number;}export interfaceHTTPLinkOptions {url : string |URL ;/*** Add ponyfill for fetch*/fetch ?: typeoffetch ;/*** Data transformer* @see https://trpc.io/docs/server/data-transformers**/transformer ?:DataTransformerOptions ;/*** Headers to be set on outgoing requests or a callback that of said headers* @see https://trpc.io/docs/client/headers*/headers ?:|HTTPHeaders | ((opts : {opList :NonEmptyArray <Operation > }) =>HTTPHeaders |Promise <HTTPHeaders >);}
tsexport interfaceHTTPBatchLinkOptions extendsHTTPLinkOptions {/*** Maximum length of HTTP URL allowed before operations are split into multiple requests* @default Infinity*/maxURLLength ?: number;/*** Maximum number of operations allowed in a single batch request* @default Infinity*/maxItems ?: number;}export interfaceHTTPLinkOptions {url : string |URL ;/*** Add ponyfill for fetch*/fetch ?: typeoffetch ;/*** Data transformer* @see https://trpc.io/docs/server/data-transformers**/transformer ?:DataTransformerOptions ;/*** Headers to be set on outgoing requests or a callback that of said headers* @see https://trpc.io/docs/client/headers*/headers ?:|HTTPHeaders | ((opts : {opList :NonEmptyArray <Operation > }) =>HTTPHeaders |Promise <HTTPHeaders >);}
URL長の最大値設定
バッチリクエスト送信時、URLが過大になることで413 Payload Too Large、414 URI Too Long、404 Not FoundといったHTTPエラーが発生する場合があります。maxURLLengthオプションはバッチで同時送信できるリクエスト数を制限します。
client/index.tstsimport {createTRPCClient ,httpBatchLink } from '@trpc/client';import type {AppRouter } from './server';constclient =createTRPCClient <AppRouter >({links : [httpBatchLink ({url : 'http://localhost:3000',maxURLLength : 2083, // a suitable size// alternatively, you can make all RPC-calls to be called with POST// methodOverride: 'POST',}),],});
client/index.tstsimport {createTRPCClient ,httpBatchLink } from '@trpc/client';import type {AppRouter } from './server';constclient =createTRPCClient <AppRouter >({links : [httpBatchLink ({url : 'http://localhost:3000',maxURLLength : 2083, // a suitable size// alternatively, you can make all RPC-calls to be called with POST// methodOverride: 'POST',}),],});
バッチサイズの制限
1. サーバー側で最大バッチサイズを設定:
maxBatchSizeは単一バッチリクエストで送信可能な操作数を制限します。この制限を超えるリクエストは400 Bad Requestエラーで拒否されます。この設定は任意のtRPCアダプターに渡すことができます。
server.tstsimport { createHTTPServer } from '@trpc/server/adapters/standalone';createHTTPServer({maxBatchSize: 10,});
server.tstsimport { createHTTPServer } from '@trpc/server/adapters/standalone';createHTTPServer({maxBatchSize: 10,});
またはNext.jsを使用している場合の例:
pages/api/trpc/[trpc].tstsexport default trpcNext.createNextApiHandler({maxBatchSize: 10,});
pages/api/trpc/[trpc].tstsexport default trpcNext.createNextApiHandler({maxBatchSize: 10,});
2. クライアント側で対応する制限を設定:
バッチリンクのmaxItemsオプションを使用してクライアントがサーバー制限を超えないようにします。これにより大規模なバッチは自動的に複数のHTTPリクエストに分割されます
client/index.tstsimport { createTRPCClient, httpBatchLink } from '@trpc/client';import type { AppRouter } from '../server';const client = createTRPCClient<AppRouter>({links: [httpBatchLink({url: 'http://localhost:3000',// 👇 should be the same or lower than the server's maxBatchSizemaxItems: 10,}),],});
client/index.tstsimport { createTRPCClient, httpBatchLink } from '@trpc/client';import type { AppRouter } from '../server';const client = createTRPCClient<AppRouter>({links: [httpBatchLink({url: 'http://localhost:3000',// 👇 should be the same or lower than the server's maxBatchSizemaxItems: 10,}),],});
リクエストバッチ処理の無効化
1. サーバー側でbatchingを無効化:
server.tstsimport {createHTTPServer } from '@trpc/server/adapters/standalone';import {appRouter } from './router';createHTTPServer ({router :appRouter ,// 👇 disable batchingallowBatching : false,});
server.tstsimport {createHTTPServer } from '@trpc/server/adapters/standalone';import {appRouter } from './router';createHTTPServer ({router :appRouter ,// 👇 disable batchingallowBatching : false,});
またはNext.jsを使用している場合:
pages/api/trpc/[trpc].tstsimport {createNextApiHandler } from '@trpc/server/adapters/next';import {appRouter } from '../../../router';export defaultcreateNextApiHandler ({router :appRouter ,// 👇 disable batchingallowBatching : false,});
pages/api/trpc/[trpc].tstsimport {createNextApiHandler } from '@trpc/server/adapters/next';import {appRouter } from '../../../router';export defaultcreateNextApiHandler ({router :appRouter ,// 👇 disable batchingallowBatching : false,});
2. tRPCクライアントのhttpLinkでhttpBatchLinkを置換
client/index.tstsimport {createTRPCClient ,httpLink } from '@trpc/client';import type {AppRouter } from './server';constclient =createTRPCClient <AppRouter >({links : [httpLink ({url : 'http://localhost:3000',}),],});
client/index.tstsimport {createTRPCClient ,httpLink } from '@trpc/client';import type {AppRouter } from './server';constclient =createTRPCClient <AppRouter >({links : [httpLink ({url : 'http://localhost:3000',}),],});
またはNext.jsを使用している場合:
utils/trpc.tstsximport type {AppRouter } from '../server';import {httpLink } from '@trpc/client';import {createTRPCNext } from '@trpc/next';export consttrpc =createTRPCNext <AppRouter >({config () {return {links : [httpLink ({url : '/api/trpc',}),],};},});
utils/trpc.tstsximport type {AppRouter } from '../server';import {httpLink } from '@trpc/client';import {createTRPCNext } from '@trpc/next';export consttrpc =createTRPCNext <AppRouter >({config () {return {links : [httpLink ({url : '/api/trpc',}),],};},});