メインコンテンツへスキップ
バージョン: 11.x

HTTPバッチリンク

非公式ベータ版翻訳

このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →

httpBatchLink終端リンクの一種で、複数のtRPC操作を単一のHTTPリクエストにまとめ、1つのtRPCプロシージャに送信します。

使用方法

httpBatchLinkをインポートしてlinks配列に次のように追加します:

client/index.ts
ts
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from './server';
 
const client = createTRPCClient<AppRouter>({
links: [
httpBatchLink({
url: 'http://localhost:3000',
// transformer,
}),
],
});
client/index.ts
ts
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from './server';
 
const client = createTRPCClient<AppRouter>({
links: [
httpBatchLink({
url: 'http://localhost:3000',
// transformer,
}),
],
});

その後、すべてのプロシージャをPromise.allで設定することでバッチ処理を活用できます。以下のコードは単一のHTTPリクエストを生成し、サーバー側では単一のデータベースクエリを実行します:

ts
const somePosts = await Promise.all([
trpc.post.byId.query(1),
trpc.post.byId.query(2),
trpc.post.byId.query(3),
]);
ts
const somePosts = await Promise.all([
trpc.post.byId.query(1),
trpc.post.byId.query(2),
trpc.post.byId.query(3),
]);

httpBatchLinkのオプション

httpBatchLink関数はHTTPBatchLinkOptions形式のオプションオブジェクトを受け取ります。

ts
export interface HTTPBatchLinkOptions extends HTTPLinkOptions {
/**
* 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 interface HTTPLinkOptions {
url: string | URL;
/**
* Add ponyfill for fetch
*/
fetch?: typeof fetch;
/**
* 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>);
}
ts
export interface HTTPBatchLinkOptions extends HTTPLinkOptions {
/**
* 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 interface HTTPLinkOptions {
url: string | URL;
/**
* Add ponyfill for fetch
*/
fetch?: typeof fetch;
/**
* 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 Large414 URI Too Long404 Not FoundといったHTTPエラーが発生する場合があります。maxURLLengthオプションはバッチで同時送信できるリクエスト数を制限します。

client/index.ts
ts
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from './server';
 
const client = 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.ts
ts
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from './server';
 
const client = 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.ts
ts
import { createHTTPServer } from '@trpc/server/adapters/standalone';
createHTTPServer({
maxBatchSize: 10,
});
server.ts
ts
import { createHTTPServer } from '@trpc/server/adapters/standalone';
createHTTPServer({
maxBatchSize: 10,
});

またはNext.jsを使用している場合の例:

pages/api/trpc/[trpc].ts
ts
export default trpcNext.createNextApiHandler({
maxBatchSize: 10,
});
pages/api/trpc/[trpc].ts
ts
export default trpcNext.createNextApiHandler({
maxBatchSize: 10,
});

2. クライアント側で対応する制限を設定:

バッチリンクのmaxItemsオプションを使用してクライアントがサーバー制限を超えないようにします。これにより大規模なバッチは自動的に複数のHTTPリクエストに分割されます

client/index.ts
ts
import { 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 maxBatchSize
maxItems: 10,
}),
],
});
client/index.ts
ts
import { 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 maxBatchSize
maxItems: 10,
}),
],
});

リクエストバッチ処理の無効化

1. サーバー側でbatchingを無効化:

server.ts
ts
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import { appRouter } from './router';
 
createHTTPServer({
router: appRouter,
// 👇 disable batching
allowBatching: false,
});
server.ts
ts
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import { appRouter } from './router';
 
createHTTPServer({
router: appRouter,
// 👇 disable batching
allowBatching: false,
});

またはNext.jsを使用している場合:

pages/api/trpc/[trpc].ts
ts
import { createNextApiHandler } from '@trpc/server/adapters/next';
import { appRouter } from '../../../router';
 
export default createNextApiHandler({
router: appRouter,
// 👇 disable batching
allowBatching: false,
});
pages/api/trpc/[trpc].ts
ts
import { createNextApiHandler } from '@trpc/server/adapters/next';
import { appRouter } from '../../../router';
 
export default createNextApiHandler({
router: appRouter,
// 👇 disable batching
allowBatching: false,
});

2. tRPCクライアントのhttpLinkhttpBatchLinkを置換

client/index.ts
ts
import { createTRPCClient, httpLink } from '@trpc/client';
import type { AppRouter } from './server';
 
const client = createTRPCClient<AppRouter>({
links: [
httpLink({
url: 'http://localhost:3000',
}),
],
});
client/index.ts
ts
import { createTRPCClient, httpLink } from '@trpc/client';
import type { AppRouter } from './server';
 
const client = createTRPCClient<AppRouter>({
links: [
httpLink({
url: 'http://localhost:3000',
}),
],
});

またはNext.jsを使用している場合:

utils/trpc.ts
tsx
import type { AppRouter } from '../server';
import { httpLink } from '@trpc/client';
import { createTRPCNext } from '@trpc/next';
 
export const trpc = createTRPCNext<AppRouter>({
config() {
return {
links: [
httpLink({
url: '/api/trpc',
}),
],
};
},
});
utils/trpc.ts
tsx
import type { AppRouter } from '../server';
import { httpLink } from '@trpc/client';
import { createTRPCNext } from '@trpc/next';
 
export const trpc = createTRPCNext<AppRouter>({
config() {
return {
links: [
httpLink({
url: '/api/trpc',
}),
],
};
},
});