Saltar al contenido principal
Versión: 11.x

Adaptador para Next.js

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

consejo

El soporte de tRPC para Next.js es mucho más amplio que solo un adaptador. Esta página cubre un resumen breve sobre cómo configurar el adaptador. Para documentación completa, consulta la guía de integración de Next.js.

Aplicación de ejemplo

DescriptionLinks
Next.js Minimal Starter

Ejemplo de Next.js

Servir tu enrutador tRPC en un proyecto de Next.js es sencillo. Simplemente crea un manejador de API en pages/api/trpc/[trpc].ts como se muestra a continuación:

pages/api/trpc/[trpc].ts
ts
import { createNextApiHandler } from '@trpc/server/adapters/next';
import { createContext } from '../../../server/trpc/context';
import { appRouter } from '../../../server/trpc/router/_app';
 
export default createNextApiHandler({
router: appRouter,
createContext,
});
pages/api/trpc/[trpc].ts
ts
import { createNextApiHandler } from '@trpc/server/adapters/next';
import { createContext } from '../../../server/trpc/context';
import { appRouter } from '../../../server/trpc/router/_app';
 
export default createNextApiHandler({
router: appRouter,
createContext,
});

Manejo de CORS y otros usos avanzados

Aunque normalmente puedes configurar el manejador de API y olvidarte como se muestra arriba, a veces quizás quieras modificarlo más.

El manejador de API creado por createNextApiHandler y equivalentes en otros frameworks es solo una función que toma objetos req y res. Esto significa que también puedes modificar esos objetos antes de pasarlos al manejador, por ejemplo para habilitar CORS.

pages/api/trpc/[trpc].ts
ts
import type { NextApiRequest, NextApiResponse } from 'next';
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 yet
const nextApiHandler = createNextApiHandler({
router: appRouter,
createContext,
});
 
// https://nextjs.org/docs/api-routes/introduction
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
) {
// We can use the response object to enable CORS
res.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 handler
return nextApiHandler(req, res);
}
pages/api/trpc/[trpc].ts
ts
import type { NextApiRequest, NextApiResponse } from 'next';
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 yet
const nextApiHandler = createNextApiHandler({
router: appRouter,
createContext,
});
 
// https://nextjs.org/docs/api-routes/introduction
export default async function handler(
req: NextApiRequest,
res: NextApiResponse,
) {
// We can use the response object to enable CORS
res.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 handler
return nextApiHandler(req, res);
}

App Router (Manejadores de Ruta)

Si estás usando el App Router de Next.js, utiliza el adaptador fetch en su lugar, ya que los manejadores de ruta de App Router se basan en los objetos estándar web Request y Response. Consulta la guía de configuración de App Router para un tutorial completo.

app/api/trpc/[trpc]/route.ts
ts
import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
import { createTRPCContext } from '../../trpc/init';
import { appRouter } from '../../trpc/routers/_app';
 
const handler = (req: Request) =>
fetchRequestHandler({
endpoint: '/api/trpc',
req,
router: appRouter,
createContext: createTRPCContext,
});
 
export { handler as GET, handler as POST };
app/api/trpc/[trpc]/route.ts
ts
import { fetchRequestHandler } from '@trpc/server/adapters/fetch';
import { createTRPCContext } from '../../trpc/init';
import { appRouter } from '../../trpc/routers/_app';
 
const handler = (req: Request) =>
fetchRequestHandler({
endpoint: '/api/trpc',
req,
router: appRouter,
createContext: createTRPCContext,
});
 
export { handler as GET, handler as POST };