Next.js アダプター
非公式ベータ版翻訳
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
ヒント
tRPCのNext.jsサポートは単なるアダプター以上の広範な機能を提供します。このページではアダプターの設定概要を説明しますが、完全なドキュメントはこちらで利用可能です
サンプルアプリケーション
| Description | Links |
|---|---|
| Next.js Minimal Starter |
Next.js の例
Next.jsプロジェクトでtRPCルーターを提供するのは簡単です。以下のようにpages/api/trpc/[trpc].tsにAPIハンドラーを作成するだけです:
pages/api/trpc/[trpc].tstsimport { createNextApiHandler } from '@trpc/server/adapters/next';import { createContext } from '../../../server/trpc/context';import { appRouter } from '../../../server/trpc/router/_app';// @link https://nextjs.org/docs/api-routes/introductionexport default createNextApiHandler({router: appRouter,createContext,});
pages/api/trpc/[trpc].tstsimport { createNextApiHandler } from '@trpc/server/adapters/next';import { createContext } from '../../../server/trpc/context';import { appRouter } from '../../../server/trpc/router/_app';// @link https://nextjs.org/docs/api-routes/introductionexport default createNextApiHandler({router: appRouter,createContext,});
CORSの処理とその他の高度な使い方
通常は前述のAPIハンドラーを「設定して忘れる」だけで問題ありませんが、場合によってはさらにカスタマイズが必要になることもあります。
createNextApiHandlerで作成されたAPIハンドラー(および他フレームワークの同等機能)は、単にreqとresオブジェクトを受け取る関数です。つまり、ハンドラーに渡す前にこれらのオブジェクトを変更できます。例えばCORSを有効にする場合などです。
pages/api/trpc/[trpc].tstsimport { createNextApiHandler } from '@trpc/server/adapters/next';import { createContext } from '../../../server/trpc/context';import { appRouter } from '../../../server/trpc/router/_app';// create the API handler, but don't return it yetconst nextApiHandler = createNextApiHandler({router: appRouter,createContext,});// @link https://nextjs.org/docs/api-routes/introductionexport default async function handler(req: NextApiRequest,res: NextApiResponse,) {// We can use the response object to enable CORSres.setHeader('Access-Control-Allow-Origin', '*');res.setHeader('Access-Control-Request-Method', '*');res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');res.setHeader('Access-Control-Allow-Headers', '*');// If you need to make authenticated CORS calls then// remove what is above and uncomment the below code// Allow-Origin has to be set to the requesting domain that you want to send the credentials back to// res.setHeader('Access-Control-Allow-Origin', 'http://example:6006');// res.setHeader('Access-Control-Request-Method', '*');// res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');// res.setHeader('Access-Control-Allow-Headers', 'content-type');// res.setHeader('Referrer-Policy', 'no-referrer');// res.setHeader('Access-Control-Allow-Credentials', 'true');if (req.method === 'OPTIONS') {res.writeHead(200);return res.end();}// finally pass the request on to the tRPC handlerreturn nextApiHandler(req, res);}
pages/api/trpc/[trpc].tstsimport { createNextApiHandler } from '@trpc/server/adapters/next';import { createContext } from '../../../server/trpc/context';import { appRouter } from '../../../server/trpc/router/_app';// create the API handler, but don't return it yetconst nextApiHandler = createNextApiHandler({router: appRouter,createContext,});// @link https://nextjs.org/docs/api-routes/introductionexport default async function handler(req: NextApiRequest,res: NextApiResponse,) {// We can use the response object to enable CORSres.setHeader('Access-Control-Allow-Origin', '*');res.setHeader('Access-Control-Request-Method', '*');res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');res.setHeader('Access-Control-Allow-Headers', '*');// If you need to make authenticated CORS calls then// remove what is above and uncomment the below code// Allow-Origin has to be set to the requesting domain that you want to send the credentials back to// res.setHeader('Access-Control-Allow-Origin', 'http://example:6006');// res.setHeader('Access-Control-Request-Method', '*');// res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, GET');// res.setHeader('Access-Control-Allow-Headers', 'content-type');// res.setHeader('Referrer-Policy', 'no-referrer');// res.setHeader('Access-Control-Allow-Credentials', 'true');if (req.method === 'OPTIONS') {res.writeHead(200);return res.end();}// finally pass the request on to the tRPC handlerreturn nextApiHandler(req, res);}
ルートハンドラ
Next.js App Routerを試していてルートハンドラを使用したい場合、fetchアダプターを利用できます。これらはWeb標準のRequest/Responseオブジェクトに基づいているためです:
app/api/trpc/[trpc]/route.tstsimport { fetchRequestHandler } from '@trpc/server/adapters/fetch';import { appRouter } from '~/server/api/router';const handler = (req: Request) =>fetchRequestHandler({endpoint: '/api/trpc',req,router: appRouter,createContext: () => ({ ... })});export { handler as GET, handler as POST };
app/api/trpc/[trpc]/route.tstsimport { fetchRequestHandler } from '@trpc/server/adapters/fetch';import { appRouter } from '~/server/api/router';const handler = (req: Request) =>fetchRequestHandler({endpoint: '/api/trpc',req,router: appRouter,createContext: () => ({ ... })});export { handler as GET, handler as POST };