HTTPバッチリンク
httpBatchLinkは、個々のtRPC操作の配列を単一のtRPCプロシージャに送信される単一のHTTPリクエストにバッチ処理する終端リンクです。
使用法
httpBatchLinkをインポートし、links配列に追加することができます。
client/index.tstsimport { createTRPCClient, httpBatchLink } from '@trpc/client';import type { AppRouter } from '../server';const client = createTRPCClient<AppRouter>({links: [httpBatchLink({url: 'https://:3000',}),// transformer,],});
client/index.tstsimport { createTRPCClient, httpBatchLink } from '@trpc/client';import type { AppRouter } from '../server';const client = createTRPCClient<AppRouter>({links: [httpBatchLink({url: 'https://:3000',}),// transformer,],});
その後、Promise.allですべてのプロシージャを設定することで、バッチ処理を利用できます。以下のコードは、正確に1つのHTTPリクエストを生成し、サーバー上では正確に1つのデータベースクエリを生成します。
tsconst somePosts = await Promise.all([trpc.post.byId.query(1),trpc.post.byId.query(2),trpc.post.byId.query(3),]);
tsconst somePosts = await Promise.all([trpc.post.byId.query(1),trpc.post.byId.query(2),trpc.post.byId.query(3),]);
httpBatchLinkのオプション
httpBatchLink関数は、HTTPBatchLinkOptionsの形状を持つオプションオブジェクトを受け取ります。
tsexport interface HTTPBatchLinkOptions extends HTTPLinkOptions {maxURLLength?: number;}export interface HTTPLinkOptions {url: string;/*** Add ponyfill for fetch*/fetch?: typeof fetch;/*** Add ponyfill for AbortController*/AbortController?: typeof AbortController | null;/*** Data transformer* @link https://trpc.dokyumento.jp/docs/data-transformers**/transformer?: DataTransformerOptions;/*** Headers to be set on outgoing requests or a callback that of said headers* @link https://trpc.dokyumento.jp/docs/header*/headers?:| HTTPHeaders| ((opts: { opList: Operation[] }) => HTTPHeaders | Promise<HTTPHeaders>);}
tsexport interface HTTPBatchLinkOptions extends HTTPLinkOptions {maxURLLength?: number;}export interface HTTPLinkOptions {url: string;/*** Add ponyfill for fetch*/fetch?: typeof fetch;/*** Add ponyfill for AbortController*/AbortController?: typeof AbortController | null;/*** Data transformer* @link https://trpc.dokyumento.jp/docs/data-transformers**/transformer?: DataTransformerOptions;/*** Headers to be set on outgoing requests or a callback that of said headers* @link https://trpc.dokyumento.jp/docs/header*/headers?:| HTTPHeaders| ((opts: { opList: 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';const client = createTRPCClient<AppRouter>({links: [httpBatchLink({url: 'https://: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';const client = createTRPCClient<AppRouter>({links: [httpBatchLink({url: 'https://:3000',maxURLLength: 2083, // a suitable size// alternatively, you can make all RPC-calls to be called with POST// methodOverride: 'POST',}),],});
リクエストのバッチ処理の無効化
1. サーバーでのbatchingの無効化:
server.tstsimport { createHTTPServer } from '@trpc/server/adapters/standalone';createHTTPServer({// [...]// 👇 disable batchingallowBatching: false,});
server.tstsimport { createHTTPServer } from '@trpc/server/adapters/standalone';createHTTPServer({// [...]// 👇 disable batchingallowBatching: false,});
または、Next.jsを使用している場合は
pages/api/trpc/[trpc].tstsexport default trpcNext.createNextApiHandler({// [...]// 👇 disable batchingallowBatching: false,});
pages/api/trpc/[trpc].tstsexport default trpcNext.createNextApiHandler({// [...]// 👇 disable batchingallowBatching: false,});
2. tRPCクライアントでhttpBatchLinkをhttpLinkに置き換えます
client/index.tstsimport { createTRPCClient, httpLink } from '@trpc/client';import type { AppRouter } from '../server';const client = createTRPCClient<AppRouter>({links: [httpLink({url: 'https://:3000',}),],});
client/index.tstsimport { createTRPCClient, httpLink } from '@trpc/client';import type { AppRouter } from '../server';const client = createTRPCClient<AppRouter>({links: [httpLink({url: 'https://:3000',}),],});
または、Next.jsを使用している場合は
utils/trpc.tstsximport type { AppRouter } from '@/server/routers/app';import { httpLink } from '@trpc/client';import { createTRPCNext } from '@trpc/next';export const trpc = createTRPCNext<AppRouter>({config() {return {links: [httpLink({url: '/api/trpc',}),],};},});
utils/trpc.tstsximport type { AppRouter } from '@/server/routers/app';import { httpLink } from '@trpc/client';import { createTRPCNext } from '@trpc/next';export const trpc = createTRPCNext<AppRouter>({config() {return {links: [httpLink({url: '/api/trpc',}),],};},});