Fastifyアダプター
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
サンプルアプリケーション
Fastifyアダプターを使い始める最良の方法は、サンプルアプリケーションを参照することです。
| Description | Links |
|---|---|
|
FastifyでtRPCを使用する方法
依存関係のインストール
bashyarn add @trpc/server fastify zod
bashyarn add @trpc/server fastify zod
⚠️ Fastifyのバージョン要件
tRPC v11のFastifyアダプターには Fastify v5以上 が必要です。 Fastify v4を使用すると、エラーなしで空のレスポンスが返される場合があります。
Zodは必須依存関係ではありませんが、以下のサンプルルーターで使用されています
AIコーディングエージェントを使用している場合は、コード生成の品質向上のためにtRPCスキルをインストールしてください:
bashnpx @tanstack/intent@latest install
bashnpx @tanstack/intent@latest install
ルーターの作成
まず、クエリ・ミューテーション・サブスクリプションを処理するためのルーターが必要です。
サンプルルーターを以下に示します。router.tsというファイル名で保存してください。
router.ts
router.tstsimport {initTRPC } from '@trpc/server';import {z } from 'zod';typeUser = {id : string;name : string;bio ?: string;};constusers :Record <string,User > = {};export constt =initTRPC .create ();export constappRouter =t .router ({getUserById :t .procedure .input (z .string ()).query ((opts ) => {returnusers [opts .input ]; // input type is string}),createUser :t .procedure .input (z .object ({name :z .string ().min (3),bio :z .string ().max (142).optional (),}),).mutation ((opts ) => {constid =Date .now ().toString ();constuser :User = {id , ...opts .input };users [user .id ] =user ;returnuser ;}),});// export type definition of APIexport typeAppRouter = typeofappRouter ;
router.tstsimport {initTRPC } from '@trpc/server';import {z } from 'zod';typeUser = {id : string;name : string;bio ?: string;};constusers :Record <string,User > = {};export constt =initTRPC .create ();export constappRouter =t .router ({getUserById :t .procedure .input (z .string ()).query ((opts ) => {returnusers [opts .input ]; // input type is string}),createUser :t .procedure .input (z .object ({name :z .string ().min (3),bio :z .string ().max (142).optional (),}),).mutation ((opts ) => {constid =Date .now ().toString ();constuser :User = {id , ...opts .input };users [user .id ] =user ;returnuser ;}),});// export type definition of APIexport typeAppRouter = typeofappRouter ;
ルーターファイルが大きくなりすぎた場合は、ルーターを複数のサブルーターに分割し、それぞれを別ファイルに実装します。その後、それらをマージして単一のルートappRouterにします。
コンテキストの作成
次に、各リクエストごとに作成されるコンテキストが必要です。
サンプルコンテキストを以下に示します。context.tsというファイル名で保存してください:
context.ts
context.tstsimport {CreateFastifyContextOptions } from '@trpc/server/adapters/fastify';export functioncreateContext ({req ,res }:CreateFastifyContextOptions ) {constuser = {name :req .headers .username ?? 'anonymous' };return {req ,res ,user };}export typeContext =Awaited <ReturnType <typeofcreateContext >>;
context.tstsimport {CreateFastifyContextOptions } from '@trpc/server/adapters/fastify';export functioncreateContext ({req ,res }:CreateFastifyContextOptions ) {constuser = {name :req .headers .username ?? 'anonymous' };return {req ,res ,user };}export typeContext =Awaited <ReturnType <typeofcreateContext >>;
Fastifyサーバーの作成
tRPCにはデフォルトでFastify用のアダプターが含まれています。このアダプターを使用すると、tRPCルーターをFastifyプラグインに変換できます。大規模なバッチリクエスト中のエラーを防ぐため、図のようにFastifyオプションmaxParamLengthに適切な値を設定してください。
Fastifyのプラグインシステムと型推論の制限により、onErrorなどの型を正しく取得できない問題が発生する可能性があります。satisfies FastifyTRPCPluginOptions<AppRouter>['trpcOptions']を追加することで、TypeScriptを支援し正しい型を取得できます。
server.tstsimport {fastifyTRPCPlugin ,FastifyTRPCPluginOptions ,} from '@trpc/server/adapters/fastify';importfastify from 'fastify';import {createContext } from './context';import {appRouter , typeAppRouter } from './router';constserver =fastify ({routerOptions : {maxParamLength : 5000,},});server .register (fastifyTRPCPlugin , {prefix : '/trpc',trpcOptions : {router :appRouter ,createContext ,onError ({path ,error }) {// report to error monitoringconsole .error (`Error in tRPC handler on path '${path }':`,error );},} satisfiesFastifyTRPCPluginOptions <AppRouter >['trpcOptions'],});(async () => {try {awaitserver .listen ({port : 3000 });} catch (err ) {server .log .error (err );process .exit (1);}})();
server.tstsimport {fastifyTRPCPlugin ,FastifyTRPCPluginOptions ,} from '@trpc/server/adapters/fastify';importfastify from 'fastify';import {createContext } from './context';import {appRouter , typeAppRouter } from './router';constserver =fastify ({routerOptions : {maxParamLength : 5000,},});server .register (fastifyTRPCPlugin , {prefix : '/trpc',trpcOptions : {router :appRouter ,createContext ,onError ({path ,error }) {// report to error monitoringconsole .error (`Error in tRPC handler on path '${path }':`,error );},} satisfiesFastifyTRPCPluginOptions <AppRouter >['trpcOptions'],});(async () => {try {awaitserver .listen ({port : 3000 });} catch (err ) {server .log .error (err );process .exit (1);}})();
これでエンドポイントがHTTP経由で利用可能になりました!
| Endpoint | HTTP URI |
|---|---|
getUserById | GET http://localhost:3000/trpc/getUserById?input=INPUT where INPUT is a URI-encoded JSON string. |
createUser | POST http://localhost:3000/trpc/createUser with req.body of type User |
WebSocketの有効化
Fastifyアダプターは、@fastify/websocketプラグインを介してWebSocketsをサポートしています。上記の手順に加えて必要なのは、依存関係をインストールし、ルーターにサブスクリプションを追加し、プラグインのuseWSSオプションを有効化することだけです。必要な@fastify/websocketの最小バージョンは3.11.0です。
依存関係のインストール
bashyarn add @fastify/websocket
bashyarn add @fastify/websocket
@fastify/websocketのインポートと登録
tsimportws from '@fastify/websocket';server .register (ws );
tsimportws from '@fastify/websocket';server .register (ws );
サブスクリプションの追加
前の手順で作成したrouter.tsファイルを編集し、次のコードを追加します:
router.tstsimport {initTRPC } from '@trpc/server';constt =initTRPC .create ();export constappRouter =t .router ({randomNumber :t .procedure .subscription (async function* () {while (true) {yield {randomNumber :Math .random () };await newPromise ((resolve ) =>setTimeout (resolve , 1000));}}),});
router.tstsimport {initTRPC } from '@trpc/server';constt =initTRPC .create ();export constappRouter =t .router ({randomNumber :t .procedure .subscription (async function* () {while (true) {yield {randomNumber :Math .random () };await newPromise ((resolve ) =>setTimeout (resolve , 1000));}}),});
useWSSオプションの有効化
server.tstsimport {fastifyTRPCPlugin ,FastifyTRPCPluginOptions ,} from '@trpc/server/adapters/fastify';importfastify from 'fastify';import {createContext } from './context';import {appRouter , typeAppRouter } from './router';constserver =fastify ();server .register (fastifyTRPCPlugin , {useWSS : true,trpcOptions : {router :appRouter ,createContext ,// Enable heartbeat messages to keep connection open (disabled by default)keepAlive : {enabled : true,// server ping message interval in millisecondspingMs : 30000,// connection is terminated if pong message is not received in this many millisecondspongWaitMs : 5000,},},});
server.tstsimport {fastifyTRPCPlugin ,FastifyTRPCPluginOptions ,} from '@trpc/server/adapters/fastify';importfastify from 'fastify';import {createContext } from './context';import {appRouter , typeAppRouter } from './router';constserver =fastify ();server .register (fastifyTRPCPlugin , {useWSS : true,trpcOptions : {router :appRouter ,createContext ,// Enable heartbeat messages to keep connection open (disabled by default)keepAlive : {enabled : true,// server ping message interval in millisecondspingMs : 30000,// connection is terminated if pong message is not received in this many millisecondspongWaitMs : 5000,},},});
これでrandomNumberトピックを購読できるようになり、毎秒ランダムな数値を受け取れるはずです 🚀。
Fastifyプラグインオプション
| name | type | optional | default | description |
|---|---|---|---|---|
| prefix | string | true | "/trpc" | URL prefix for tRPC routes |
| useWSS | boolean | true | false | Enable WebSocket support via @fastify/websocket |
| trpcOptions | FastifyHandlerOptions<AppRouter, Request, Reply> | false | n/a | tRPC handler options including router, createContext, etc. |