Saltar al contenido principal
Versión: 10.x

Metadatos

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Los metadatos de procedimiento te permiten añadir una propiedad opcional meta específica del procedimiento, que estará disponible en todos los parámetros de las funciones de middleware.

consejo

Utiliza los metadatos junto con trpc-openapi si quieres exponer endpoints compatibles con REST para tu aplicación.

Crear un enrutador con metadatos tipados

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({
// [...]
});

Ejemplo con configuraciones de autenticación por ruta

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

Meta por defecto, encadenamiento y fusión superficial

Puedes establecer valores predeterminados para tu tipo de meta, y si encadenas meta sobre un procedimiento base, se fusionará superficialmente.

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