본문 바로가기
버전: 11.x

Next.js 어댑터

비공식 베타 번역

이 페이지는 PageTurner AI로 번역되었습니다(베타). 프로젝트 공식 승인을 받지 않았습니다. 오류를 발견하셨나요? 문제 신고 →

팁

tRPC의 Next.js 지원은 단순한 어댑터를 훨씬 뛰어넘습니다. 이 페이지는 어댑터 설정 방법에 대한 간략한 요약을 다룹니다. 전체 문서는 Next.js 통합 가이드를 참고하세요.

예시 애플리케이션​

DescriptionLinks
Next.js Minimal Starter

Next.js 예제​

Next.js 프로젝트에서 tRPC 라우터를 제공하는 것은 매우 간단합니다. 아래와 같이 pages/api/trpc/[trpc].ts에 API 핸들러를 생성하면 됩니다:

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,
});

CORS 처리 및 기타 고급 사용법​

보통은 위와 같이 API 핸들러를 설정한 후 그대로 두어도 되지만, 때로는 추가로 수정하고 싶을 수 있습니다.

createNextApiHandler나 다른 프레임워크의 유사 함수로 생성된 API 핸들러는 단순히 req와 res 객체를 받는 함수입니다. 즉 핸들러로 전달하기 전에 이러한 객체를 수정할 수도 있습니다. 예를 들어 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 (라우트 핸들러)​

Next.js App Router를 사용 중이라면 fetch 어댑터를 대신 사용하세요. App Router의 라우트 핸들러는 웹 표준인 Request와 Response 객체를 기반으로 하기 때문입니다. 전체적인 설명을 보려면 App Router 설정 가이드를 참고하세요.

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 };