Next.js 适配器
提示
tRPC 对 Next.js 的支持远远超出了适配器。此页面简要概述了如何设置适配器,但完整的文档在此处提供
示例应用
描述 | 链接 |
---|---|
Next.js 最小启动器 |
Next.js 示例
在 Next.js 项目中提供您的 tRPC 路由非常简单。只需在 pages/api/trpc/[trpc].ts
中创建一个 API 处理程序,如下所示
pages/api/trpc/[trpc].tsts
import { createNextApiHandler } from '@trpc/server/adapters/next';import { createContext } from '../../../server/trpc/context';import { appRouter } from '../../../server/trpc/router/_app';// @link https://nextjs.net.cn/docs/api-routes/introductionexport default createNextApiHandler({router: appRouter,createContext,});
pages/api/trpc/[trpc].tsts
import { createNextApiHandler } from '@trpc/server/adapters/next';import { createContext } from '../../../server/trpc/context';import { appRouter } from '../../../server/trpc/router/_app';// @link https://nextjs.net.cn/docs/api-routes/introductionexport default createNextApiHandler({router: appRouter,createContext,});
处理 CORS 和其他高级用法
虽然您通常可以像上面那样“设置并忘记”API 处理程序,但有时您可能希望进一步修改它。
由 createNextApiHandler
创建的 API 处理程序以及其他框架中的等效程序只是一个接受 req
和 res
对象的函数。这意味着您也可以在将它们传递给处理程序之前修改这些对象,例如启用 CORS。
pages/api/trpc/[trpc].tsts
import { 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.net.cn/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].tsts
import { 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.net.cn/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 应用路由器并希望使用路由处理程序,您可以通过使用fetch 适配器来实现,因为它们基于 Web 标准请求和响应对象
app/api/trpc/[trpc]/route.tsts
import { 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.tsts
import { 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 };