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

메타데이터

비공식 베타 번역

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

프로시저 메타데이터를 사용하면 선택적으로 프로시저별 meta 속성을 추가할 수 있으며, 이 속성은 모든 미들웨어 함수 매개변수에서 사용할 수 있습니다.

애플리케이션에 REST 호환 엔드포인트를 노출하려면 trpc-openapi와 함께 메타데이터를 사용하세요.

타입이 지정된 메타데이터로 라우터 생성

tsx
import { initTRPC } from '@trpc/server';
// [...]
interface Meta {
authRequired: boolean;
}
export const t = initTRPC.context<Context>().meta<Meta>().create();
export const appRouter = t.router({
// [...]
});
tsx
import { initTRPC } from '@trpc/server';
// [...]
interface Meta {
authRequired: boolean;
}
export const t = initTRPC.context<Context>().meta<Meta>().create();
export const appRouter = t.router({
// [...]
});

경로별 인증 설정 예시

server.ts
tsx
import { initTRPC } from '@trpc/server';
// [...]
interface Meta {
authRequired: boolean;
}
export const t = initTRPC.context<Context>().meta<Meta>().create();
export const authedProcedure = t.procedure.use(async (opts) => {
const { meta, next, ctx } = opts;
// only check authorization if enabled
if (meta?.authRequired && !ctx.user) {
throw new TRPCError({ code: 'UNAUTHORIZED' });
}
return next();
});
export const appRouter = t.router({
hello: authedProcedure.meta({ authRequired: false }).query(() => {
return {
greeting: 'hello world',
};
}),
protectedHello: authedProcedure.meta({ authRequired: true }).query(() => {
return {
greeting: 'hello-world',
};
}),
});
server.ts
tsx
import { initTRPC } from '@trpc/server';
// [...]
interface Meta {
authRequired: boolean;
}
export const t = initTRPC.context<Context>().meta<Meta>().create();
export const authedProcedure = t.procedure.use(async (opts) => {
const { meta, next, ctx } = opts;
// only check authorization if enabled
if (meta?.authRequired && !ctx.user) {
throw new TRPCError({ code: 'UNAUTHORIZED' });
}
return next();
});
export const appRouter = t.router({
hello: authedProcedure.meta({ authRequired: false }).query(() => {
return {
greeting: 'hello world',
};
}),
protectedHello: authedProcedure.meta({ authRequired: true }).query(() => {
return {
greeting: 'hello-world',
};
}),
});

기본 메타, 체이닝 및 얕은 병합

메타 타입에 대한 기본값을 설정할 수 있으며, 기본 프로시저 위에 메타를 체이닝하면 얕은 병합(shallow merge)이 수행됩니다.

tsx
import { initTRPC } from '@trpc/server';
interface Meta {
authRequired: boolean;
role?: 'user' | 'admin'
}
export const t = initTRPC
.context<Context>()
.meta<Meta>()
.create({
// Set a default value
defaultMeta: { authRequired: false }
});
const publicProcedure = t.procedure
// ^ Default Meta: { authRequired: false }
const authProcedure = publicProcedure
.use(authMiddleware)
.meta({
authRequired: true;
role: 'user'
});
// ^ Meta: { authRequired: true, role: 'user' }
const adminProcedure = authProcedure
.meta({
role: 'admin'
});
// ^ Meta: { authRequired: true, role: 'admin' }
tsx
import { initTRPC } from '@trpc/server';
interface Meta {
authRequired: boolean;
role?: 'user' | 'admin'
}
export const t = initTRPC
.context<Context>()
.meta<Meta>()
.create({
// Set a default value
defaultMeta: { authRequired: false }
});
const publicProcedure = t.procedure
// ^ Default Meta: { authRequired: false }
const authProcedure = publicProcedure
.use(authMiddleware)
.meta({
authRequired: true;
role: 'user'
});
// ^ Meta: { authRequired: true, role: 'user' }
const adminProcedure = authProcedure
.meta({
role: 'admin'
});
// ^ Meta: { authRequired: true, role: 'admin' }