Links 概要
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
Linksを使用すると、tRPCクライアントとサーバー間のデータフローをカスタマイズできます。各リンクは単一の責務を持ち、tRPC操作(クエリ、ミューテーション、サブスクリプション)に対する自己完結型の変更か、操作に基づく副作用(ロギングなど)のいずれかを実行します。
複数のリンクを配列にまとめてtRPCクライアント設定のlinksプロパティに提供できます。これはリンクチェーンを形成し、tRPCクライアントはリクエスト時にlinks配列の順序でリンクを実行し、レスポンス時には逆順で再実行します。以下がリンクチェーンの概念図です:
utils/trpc.tstsimport {createTRPCClient ,httpBatchLink ,loggerLink } from '@trpc/client';import type {AppRouter } from './server';export consttrpc =createTRPCClient <AppRouter >({links : [loggerLink (),httpBatchLink ({url : 'http://localhost:3000',}),],});
utils/trpc.tstsimport {createTRPCClient ,httpBatchLink ,loggerLink } from '@trpc/client';import type {AppRouter } from './server';export consttrpc =createTRPCClient <AppRouter >({links : [loggerLink (),httpBatchLink ({url : 'http://localhost:3000',}),],});
カスタムリンクの作成
リンクはTRPCLink型に従う関数です。各リンクは3つの部分で構成されます:
-
リンクはパラメータを持たない関数を返します。これはリンクの初期化が行われるセットアップフェーズであり、アプリごとに1回だけ発生するため、キャッシュやその他の状態の保存に有用です。
-
ステップ1の関数は、クライアントが実行中の
Operationであるopと、チェーン内の次のリンクを呼び出すnext関数の2つのプロパティを持つオブジェクトを受け取る別の関数を返します。 -
ステップ2の関数は、
@trpc/serverが提供するobservable関数を返す最終関数を返します。observableはobserverを受け取る関数を引数に取り、リンクが操作結果を処理する方法を上位チェーンに通知します。この関数内ではnext(op)を返すか、nextを購読して操作結果を処理できます。
例
utils/customLink.tstsximport {TRPCLink } from '@trpc/client';import {observable } from '@trpc/server/observable';import type {AppRouter } from './server';export constcustomLink :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 resultsreturnobservable ((observer ) => {console .log ('performing operation:',op );constunsubscribe =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 ();},});returnunsubscribe ;});};};
utils/customLink.tstsximport {TRPCLink } from '@trpc/client';import {observable } from '@trpc/server/observable';import type {AppRouter } from './server';export constcustomLink :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 resultsreturnobservable ((observer ) => {console .log ('performing operation:',op );constunsubscribe =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 ();},});returnunsubscribe ;});};};
参考資料
カスタムリンク作成の実例が必要な場合は、tRPCが提供する組み込みリンクをGitHubで確認できます。
終端リンク
終端リンクはリンクチェーンの最後に位置します。next関数を呼び出す代わりに、構成されたtRPC操作をtRPCサーバーに送信し、OperationResultEnvelopeを返す責務を持ちます。
tRPCクライアント設定のlinks配列には少なくとも1つのリンクが必要で、それは終端リンクである必要があります。もしlinksの末尾に終端リンクがない場合、tRPC操作はサーバーに送信されません。
httpBatchLinkはtRPCが推奨する終端リンクです。
httpLink, httpBatchStreamLink, httpSubscriptionLink, wsLink, および localLink は、ニーズに応じて使用できる終端リンクのその他の例です。
コンテキスト管理
操作がリンクチェーンを移動する際、各リンクが読み取り・変更可能なコンテキストを維持します。これによりリンク間でメタデータを伝搬させ、他のリンクの実行ロジックで使用できます。
現在のコンテキストオブジェクトの取得と変更はop.contextで行います。
特定の操作に対するコンテキストオブジェクトの初期値は、queryやuseQueryフック(またはmutation、subscriptionなど)にcontextパラメータを渡すことで設定できます。
使用例については、特定のリクエストでのバッチ処理の無効化を参照してください。