メタデータ
プロシージャメタデータを使用すると、オプションのプロシージャ固有の `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.tstsx
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 enabledif (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.tstsx
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 enabledif (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',};}),});
デフォルトのメタデータ、チェーン、および浅いマージ
メタデータ型のデフォルト値を設定できます。基本プロシージャの上にメタデータをチェーンすると、浅いマージが行われます。
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 valuedefaultMeta: { 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 valuedefaultMeta: { 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' }