メインコンテンツへスキップ
バージョン: 11.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',
};
}),
});

デフォルトメタ、チェイニング、および浅いマージ

メタタイプのデフォルト値を設定でき、ベースプロシージャ上でメタをチェインすると浅いマージが行われます。

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