MeWrite Docs

tRPC: Procedure not found

tRPCでプロシージャが見つからない場合のエラー原因と解決策

概要

tRPCでクライアントから呼び出したプロシージャがサーバーに存在しない場合のエラーです。

エラーメッセージ

``` TRPCClientError: No “query” procedure with name “user.getById” found ```

原因

  1. プロシージャ名の不一致: クライアントとサーバーで異なる名前
  2. ルーターのマージ忘れ: サブルーターが追加されていない
  3. 型の再生成忘れ: スキーマ変更後の型が古い
  4. インポートエラー: ルーターのエクスポート漏れ

解決策

1. ルーター定義を確認

```typescript // server/routers/user.ts import { router, publicProcedure } from ‘../trpc’; import { z } from ‘zod’;

export const userRouter = router({ getById: publicProcedure .input(z.object({ id: z.string() })) .query(async ({ input }) => { return await db.user.findUnique({ where: { id: input.id } }); }),

create: publicProcedure .input(z.object({ name: z.string(), email: z.string().email() })) .mutation(async ({ input }) => { return await db.user.create({ data: input }); }), }); ```

2. ルートルーターにマージ

```typescript // server/routers/_app.ts import { router } from ‘../trpc’; import { userRouter } from ‘./user’; import { postRouter } from ‘./post’;

export const appRouter = router({ user: userRouter, post: postRouter, });

export type AppRouter = typeof appRouter; ```

3. クライアントで正しく呼び出し

```typescript // client/index.ts import { createTRPCProxyClient, httpBatchLink } from ‘@trpc/client’; import type { AppRouter } from ‘../server/routers/_app’;

const trpc = createTRPCProxyClient({ links: [httpBatchLink({ url: ‘/api/trpc’ })], });

// 使用 const user = await trpc.user.getById.query({ id: ‘1’ }); ```

4. 型を再生成(Next.js App Router)

```typescript // app/api/trpc/[trpc]/route.ts import { fetchRequestHandler } from ‘@trpc/server/adapters/fetch’; import { appRouter } from ‘@/server/routers/_app’;

const handler = (req: Request) => fetchRequestHandler({ endpoint: ‘/api/trpc’, req, router: appRouter, createContext: () => ({}), });

export { handler as GET, handler as POST }; ```

よくある間違い

  • query と mutation を間違える
  • AppRouter の型をインポートし忘れる
  • エンドポイントURLの不一致

関連エラー

関連エラー

API の他のエラー

最終更新: 2025-12-11