RORK LABEN
APPLE — Apple のイベントは9月9日、同日に iOS 27 の RC が公開されます。正式リリースは9月14日、予約は9月12日、店頭は9月18日の見込みですTESTING — 実質的な検証期間は RC 公開から正式リリースまでの5日間です。React Native / Expo 製アプリは、この間に Xcode 27 と iOS 27 SDK で一通り動かしておきたいところですSIRI — iOS 27 は Siri が全面刷新されます。Siri Intents や音声まわりを使っているアプリは、優先して確認する対象になりますPLAY — Google Play の target API level 36 要件は8月31日に発効済みです。間に合わなかった場合も、Play Console から11月1日までの延長申請がまだ出せますEXPO — expo@57.0.17 が React Native 0.86.3 へ更新し、react-native-worklets や reanimated を使うアプリで出ていた Hermes V1 のメモリ退行が解消されましたRORK — 同じ Rork でも成果物が違います。本家 Rork は React Native(Expo)を生成し、Rork Max は Swift を生成してクラウドの Mac ファームでコンパイルしますAPPLE — Apple のイベントは9月9日、同日に iOS 27 の RC が公開されます。正式リリースは9月14日、予約は9月12日、店頭は9月18日の見込みですTESTING — 実質的な検証期間は RC 公開から正式リリースまでの5日間です。React Native / Expo 製アプリは、この間に Xcode 27 と iOS 27 SDK で一通り動かしておきたいところですSIRI — iOS 27 は Siri が全面刷新されます。Siri Intents や音声まわりを使っているアプリは、優先して確認する対象になりますPLAY — Google Play の target API level 36 要件は8月31日に発効済みです。間に合わなかった場合も、Play Console から11月1日までの延長申請がまだ出せますEXPO — expo@57.0.17 が React Native 0.86.3 へ更新し、react-native-worklets や reanimated を使うアプリで出ていた Hermes V1 のメモリ退行が解消されましたRORK — 同じ Rork でも成果物が違います。本家 Rork は React Native(Expo)を生成し、Rork Max は Swift を生成してクラウドの Mac ファームでコンパイルします
記事一覧/開発ツール
開発ツール/2026-04-01上級

Rork Max × tRPC × Cloudflare Workers:型検査が緑でも本番が 500 を返す3つの境界

tRPC と Cloudflare Workers でエッジAPIを組む実装手順に加えて、型検査を通り抜けてしまう3つの境界—D1の列名と出力スキーマ、KVキャッシュの戻り値、レート制限の計数—を実測値つきで検証し、修正版のコードまで示します。

tRPCCloudflare Workers24型安全エッジAPIRork Max232TypeScript8バックエンド11D12

プレミアム記事

tsc は緑でした。trpc.user.getProfile.useQuery の戻り値には補完が効き、profile.nameprofile.bio も、エディタ上では何ひとつ間違っていませんでした。

それでも、デプロイした Worker は INTERNAL_SERVER_ERROR を返し続けました。

原因は型ではありませんでした。D1 が返す列名が avatar_url で、.output() に渡した Zod スキーマが期待していたのは avatarUrl だった、というだけのことです。型検査はビルド時にコードの内側だけを見ます。データベースの列名は、その外側にあります。

個人開発では、この手の失敗に気づく人が自分しかいません。私がこの一件で学んだのは、tRPC が保証してくれる範囲と、保証してくれない範囲の線引きでした。ここを曖昧にしたまま「型安全だから安心」と考えると、コンパイラが通した設計がそのまま本番で 500 を返します。

以下では、tRPC(TypeScript Remote Procedure Call)と Cloudflare Workers を組み合わせたバックエンドを組み直す手順を追いながら、型が守ってくれる境界がどこで切れるのかを毎回明示していきます。ルーターの実装だけでなく、D1 との列名の対応、KV キャッシュの戻り値の形、レート制限の計数の正確さ——私が個人開発で実際に踏んで、手元で数字を取り直したところまで含めて共有します。

tRPC が守る範囲と、守らない範囲

先に全体像を置いておきます。以降の実装は、この表の「守らない」側を人手で埋めていく作業だと考えていただくと読みやすいはずです。

境界型の保証破れたときに起きること
クライアント ↔ ルーター定義あり(`AppRouter` 型の共有)ビルドが落ちる。本番には出ない
入力値 ↔ Zod スキーマあり(実行時に検証)`BAD_REQUEST` が返る。想定内の失敗
D1 の列名 ↔ 出力スキーマなし`.output()` が実行時に落ち、全件 500
KV の戻り値 ↔ 宣言した型なし(`as T` で素通り)形の違う値が型どおりの顔で返る
環境変数(Secrets)の存在なしデプロイ後の初回リクエストで気づく

型が効くのは上の 2 行だけです。下の 3 行は、書き手が意識して閉じない限り開きっぱなしになります。

tRPC と Cloudflare Workers の組み合わせが強力な理由

tRPC の核心:型の自動伝播

従来の REST API 開発では、バックエンドとフロントエンドで同じ型定義を別々に管理するのが一般的でした。しかし tRPC では、サーバー側で定義した型が自動的にクライアント側に伝わります。

// サーバー側(Cloudflare Workers)
export const appRouter = router({
  getUserProfile: publicProcedure
    .input(z.object({ userId: z.string().uuid() }))
    .query(async ({ input, ctx }) => {
      // 戻り値の型が自動的にクライアントに伝わる
      return {
        id: input.userId,
        name: 'Masaki',
        email: 'user@example.com',
        createdAt: new Date().toISOString(),
      };
    }),
});
 
// AppRouter 型をエクスポートしてクライアントと共有
export type AppRouter = typeof appRouter;

このように定義すると、Rork Max 側のコードでは補完が効き、型エラーが即座に検出されます。

Cloudflare Workers のエッジ実行の優位性

Cloudflare Workers は世界 300 以上のデータセンターで動作するエッジコンピューティング環境です。ユーザーに最も近いデータセンターでコードが実行されるため、従来のサーバーレス関数と比べてコールドスタートがなく、レイテンシが極めて低い点が特徴です。

個人開発者にとっての現実的なメリットとして、無料プランで月 10 万リクエストまで処理でき、従量課金のコストも非常に安価です。Rork Max アプリのバックエンドとして、スタートアップのコストを最小限に抑えながら本番グレードのインフラを利用できます。

環境構築:プロジェクト全体の構成設計

モノレポ構成の採用

型を共有するために、フロントエンド(Rork Max)とバックエンド(Cloudflare Workers)を同一リポジトリで管理するモノレポ構成を推奨します。

my-rork-app/
├── apps/
│   └── mobile/        ← Rork Max プロジェクト
│       ├── app/
│       ├── package.json
│       └── ...
├── packages/
│   └── api/           ← tRPC バックエンド(Cloudflare Workers)
│       ├── src/
│       │   ├── index.ts       ← Workers エントリーポイント
│       │   ├── router/        ← tRPC ルーター定義
│       │   ├── middleware/    ← 認証・ログ等のミドルウェア
│       │   └── db/            ← Supabase / D1 連携
│       ├── wrangler.toml
│       └── package.json
├── package.json       ← ワークスペースルート
└── pnpm-workspace.yaml

依存パッケージのインストール

# バックエンドパッケージ
cd packages/api
pnpm add @trpc/server hono @hono/trpc-server zod
pnpm add -D wrangler @cloudflare/workers-types typescript
 
# Rork Max(モバイル)側
cd apps/mobile
pnpm add @trpc/client @trpc/react-query @tanstack/react-query zod

wrangler.toml の設定

# packages/api/wrangler.toml
name = "my-rork-api"
main = "src/index.ts"
compatibility_date = "2026-03-01"
compatibility_flags = ["nodejs_compat"]
 
[vars]
ENVIRONMENT = "production"
 
[[kv_namespaces]]
binding = "CACHE"
id = "your-kv-namespace-id"
 
[[d1_databases]]
binding = "DB"
database_name = "my-rork-db"
database_id = "your-database-id"

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
SELECT * と .output() を同じ手続きに並べると本番で全件 500 になる理由と、境界に変換関数を1枚置く修正版コードを手に入れられる
「60回/分」と書いたレート制限が実測 30.5 回/分しか通さない原因を計測結果つきで確認し、時刻バケット方式の修正実装をそのまま流用できる
KVキャッシュが D1Result を配列の顔で返す罠と、waitUntil による書き込み待ちの解消まで含めた実装を把握できる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-04-02
Rork × Hono.js × Cloudflare Workers で本番レベル REST API を構築する — ルーティング・JWT認証・D1・R2・レート制限の実装
Rork製アプリのバックエンドとしてHono.js × Cloudflare Workersを採用し、JWT認証・D1データベース・R2ファイルストレージ・レート制限を組み込んだ本番レベルのREST APIをゼロから構築する完全実践ガイドです。
開発ツール2026-06-22
無印 Rork と Rork Max を1つのバックエンドで支える — 旧バイナリを壊さない API レスポンス契約の設計
無印 Rork(React Native / Expo)と Rork Max(ネイティブ Swift)が同じ Cloudflare Workers バックエンドを叩く構成では、強制アップデートできない旧バイナリを壊さないことが設計の中心になります。レスポンスを封筒型にして加算のみで育て、能力フラグでクライアント差を吸収し、古いバージョンを安全に畳むまでを実装で示します。
開発ツール2026-03-28
Rork Max × Supabase Edge Functions & Row Level Security — セキュアな API 設計
Rork Max アプリで Supabase Edge Functions と Row Level Security(RLS)を活用し、セキュアでスケーラブルな API を設計・実装するための上級ガイド。認可パターンから本番運用まで網羅します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →