元数据
非官方测试版翻译
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
过程元数据允许您添加可选的、过程特定的 meta 属性,该属性将在所有中间件函数参数中可用。
技巧
若需为应用提供 REST 兼容的端点,请结合使用元数据与 trpc-openapi。
创建带有类型化元数据的路由器
tsximport { initTRPC } from '@trpc/server';// [...]interface Meta {authRequired: boolean;}export const t = initTRPC.context<Context>().meta<Meta>().create();export const appRouter = t.router({// [...]});
tsximport { initTRPC } from '@trpc/server';// [...]interface Meta {authRequired: boolean;}export const t = initTRPC.context<Context>().meta<Meta>().create();export const appRouter = t.router({// [...]});
按路由认证设置示例
server.tstsximport { 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.tstsximport { 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',};}),});
默认元数据、链式操作与浅层合并
您可为元数据类型设置默认值,若在基础过程之上链式添加元数据,系统将执行浅层合并。
tsximport { 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' }
tsximport { 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' }