プロシージャの定義
非公式ベータ版翻訳
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
プロシージャはクライアントに公開される関数であり、以下のいずれかの種類があります:
-
Query- データ取得に使用され、通常はデータを変更しません -
Mutation- データ送信に使用され、作成・更新・削除目的で頻繁に利用されます -
Subscription- これは不要な場合もあり、専用ドキュメントも用意されています
tRPCにおけるプロシージャは、バックエンド関数を作成するための非常に柔軟なプリミティブです。イミュータブルなビルダーパターンを採用しているため、再利用可能なベースプロシージャを作成して複数のプロシージャ間で機能を共有できます。
プロシージャの作成
tRPCセットアップ時に作成するtオブジェクトは初期t.procedureを返し、これが他のすべてのプロシージャの基盤となります:
tsimport {initTRPC } from '@trpc/server';import {z } from 'zod';constt =initTRPC .context <{signGuestBook : () =>Promise <void> }>().create ();export constrouter =t .router ;export constpublicProcedure =t .procedure ;constappRouter =router ({// Queries are the best place to fetch datahello :publicProcedure .query (() => {return {message : 'hello world',};}),// Mutations are the best place to do things like updating a databasegoodbye :publicProcedure .mutation (async (opts ) => {awaitopts .ctx .signGuestBook ();return {message : 'goodbye!',};}),});
tsimport {initTRPC } from '@trpc/server';import {z } from 'zod';constt =initTRPC .context <{signGuestBook : () =>Promise <void> }>().create ();export constrouter =t .router ;export constpublicProcedure =t .procedure ;constappRouter =router ({// Queries are the best place to fetch datahello :publicProcedure .query (() => {return {message : 'hello world',};}),// Mutations are the best place to do things like updating a databasegoodbye :publicProcedure .mutation (async (opts ) => {awaitopts .ctx .signGuestBook ();return {message : 'goodbye!',};}),});
再利用可能な「ベースプロシージャ」
一般的なパターンとして、t.procedureをpublicProcedureとしてリネーム・エクスポートすることを推奨します。これにより、特定ユースケース向けに他の名前付きプロシージャを作成・エクスポートする余地が生まれます。この「ベースプロシージャ」パターンはtRPCにおけるコードと動作の再利用の中核であり、ほぼすべてのアプリケーションで必要となるでしょう。
以下の例はユーザー入力を受け取り、門番のようにそれを認可します。これは明らかに単純化のための作為的な例であり、アプリケーションユーザーを安全に認可する適切な方法ではありません。実際には、ヘッダー、コンテキスト、ミドルウェア、メタデータを組み合わせて、ユーザーの認証と認可を行うことをお勧めします。
tsexport constauthorizedProcedure =publicProcedure .input (z .object ({townName :z .string () })).use ((opts ) => {if (opts .input .townName !== 'Pucklechurch') {throw newTRPCError ({code : 'FORBIDDEN',message : "We don't take kindly to out-of-town folk",});}returnopts .next ();});export constappRouter =t .router ({hello :authorizedProcedure .query (() => {return {message : 'hello world',};}),goodbye :authorizedProcedure .mutation (async (opts ) => {awaitopts .ctx .signGuestBook ();return {message : 'goodbye!',};}),});
tsexport constauthorizedProcedure =publicProcedure .input (z .object ({townName :z .string () })).use ((opts ) => {if (opts .input .townName !== 'Pucklechurch') {throw newTRPCError ({code : 'FORBIDDEN',message : "We don't take kindly to out-of-town folk",});}returnopts .next ();});export constappRouter =t .router ({hello :authorizedProcedure .query (() => {return {message : 'hello world',};}),goodbye :authorizedProcedure .mutation (async (opts ) => {awaitopts .ctx .signGuestBook ();return {message : 'goodbye!',};}),});