◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-07-18上級

別サーバーを立てずに済ませる — Expo Router の API Routes でバックエンドをアプリに同居させる

RevenueCat の Webhook を受けるためだけに、また Worker を1つ増やす。その繰り返しに疲れたとき、Expo Router の API Routes に出会いました。アプリと同じリポジトリにバックエンドを同居させる実装を、署名検証とデプロイ先の選び方まで含めて共有します。

Expo Router6API Routesバックエンド11RevenueCat30Webhook3

✦ プレミアム記事

先日、7本目の小さなアプリを出す準備をしていて、手が止まりました。RevenueCat の Webhook を受け取るためだけに、また Cloudflare Worker を1つ新規に作り、環境変数を設定し、デプロイ URL を控え、ダッシュボードに貼りに行く。この一連の作業を、これまで何度繰り返してきただろうと。

Worker 自体はよくできた道具です。ただ、アプリが増えるたびに「アプリのリポジトリ」と「そのアプリ専用の小さなサーバーのリポジトリ」が2つずつ増えていく構造に、静かな摩擦を感じていました。バージョンがずれる。どちらのシークレットをどこに置いたか忘れる。片方だけデプロイして不整合が起きる。

そんなときに Expo Router の API Routes を本気で使ってみて、手応えが変わりました。バックエンドを、アプリと同じリポジトリの app/api/ に同居させる。その実装を、RevenueCat の Webhook 受信を題材にして、署名検証とデプロイ先の選定まで含めて具体的に共有します。

別 Worker を立てるたびに増えていた、見えない管理コスト

まず、私がなぜ同居を選ぶようになったかを正直に書きます。

個人開発で iOS/Android のアプリを長く運用していると、サーバー側に置きたい処理は意外と小さなものばかりです。AdMob のリワード SSV を検証する。RevenueCat や App Store の Webhook を受けて自前 DB に反映する。API キーをクライアントに晒さないためのプロキシを1本置く。どれも数十行で済みます。

その数十行のために、独立したリポジトリとデプロイパイプラインを毎回1セット用意する。これがアプリ本数ぶん積み上がっていくと、コードの量ではなく「管理対象の個数」が効いてきます。私の場合、6本のアプリに対して小さな Worker が散らばり、どれがどのアプリのものか、README を見ないと思い出せない状態になっていました。

API Routes は、この「個数」を減らすための選択肢です。アプリ1本につきリポジトリ1つ。バックエンドはその中に住みます。

API Routes は Expo アプリの中に住むバックエンド

Expo Router の API Routes は、app/ ディレクトリの中に +api.ts という接尾辞のファイルを置くと、それがサーバー側で実行されるエンドポイントになる仕組みです。画面用のルーティングと同じファイルベースの規約を、そのままサーバーにも延長したもの、と捉えると分かりやすいです。

たとえば app/api/hello+api.ts を作ると、/api/hello という URL で叩けるエンドポイントになります。中身は Web 標準の Request を受けて Response を返す関数です。Next.js の Route Handlers を触ったことがあれば、ほぼ同じ感覚で書けます。

重要な前提が1つあります。API Routes はサーバー実行環境が必要なので、app.json の web.output を "server" にしておく必要があります。この設定を忘れると、ビルドは通るのにエンドポイントが 404 を返す、という地味にハマりやすい状態になります。

// app.json
{
  "expo": {
    "web": {
      "output": "server"
    }
  }
}
✦

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

この記事の続きを読む

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

この記事で得られること
✦app/api/webhook+api.ts だけで RevenueCat の Webhook を受ける最小実装(コピーして動く TypeScript 付き)
✦署名検証とシークレットの置き場所、EAS Hosting と Vercel のデプロイ差を1つの表で比較
✦別 Worker を立てる場合と同居させる場合の判断軸を、私が6本のアプリで実際に分けた基準で提示
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ 開発ツール2026-04-29
Rork × Cloudflare Durable Objects で『リアルタイム協調アプリ』のバックエンドを作る実装ガイド
Rork で作ったアプリに、Cloudflare Durable Objects を使った自前のリアルタイム協調バックエンドを組み込む実装手順を、本番で動くコードと一緒にまとめました。Liveblocks や Yjs ホスティングを使わずに、低コストで多人数同時接続を支える設計をお伝えします。
⬡ 開発ツール2026-10-15
EXPO_PUBLIC_ の値が、開発では読めて本番だけ undefined になる書き方を、変換結果で見分けます
API の URL が開発中は読めるのに、ビルドした途端に undefined になる。原因は process.env の書き方でした。babel-preset-expo の変換結果を開発・本番で並べ、置き換わる書き方と残ってしまう書き方を表にしました。
⬡ 開発ツール2026-10-14
起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、読み込みより先に過ぎていたためです
Android 版の起動広告が、アプリを完全に終了してから開く回だけ一度も出ていませんでした。「前面に戻った」合図を読み込みの完了と切り離し、順番ごとにテストできる形へ組み直した記録です。