tRPC: Procedure not found
tRPCでプロシージャが見つからない場合のエラー原因と解決策
概要
tRPCでクライアントから呼び出したプロシージャがサーバーに存在しない場合のエラーです。
エラーメッセージ
``` TRPCClientError: No “query” procedure with name “user.getById” found ```
原因
- プロシージャ名の不一致: クライアントとサーバーで異なる名前
- ルーターのマージ忘れ: サブルーターが追加されていない
- 型の再生成忘れ: スキーマ変更後の型が古い
- インポートエラー: ルーターのエクスポート漏れ
解決策
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 の他のエラー
この記事は役に立ちましたか?