Aller au contenu principal
Version : 11.x

Métadonnées

Traduction Bêta Non Officielle

Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →

Les métadonnées de procédure vous permettent d'ajouter une propriété meta optionnelle spécifique à chaque procédure, qui sera disponible dans tous les paramètres des fonctions de middleware.

astuce

Utilisez les métadonnées avec trpc-openapi si vous souhaitez exposer des endpoints REST compatibles pour votre application.

Créer un routeur avec métadonnées typées​

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

Exemple avec paramètres d'authentification par route​

server.ts
tsx
import { initTRPC, TRPCError } from '@trpc/server';
 
type Context = { user: { name: string } | null };
 
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, TRPCError } from '@trpc/server';
 
type Context = { user: { name: string } | null };
 
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',
};
}),
});

Métadonnées par défaut, chaînage et fusion superficielle​

Vous pouvez définir des valeurs par défaut pour votre type de métadonnées. Si vous chaînez des métadonnées sur une procédure de base, elles seront fusionnées de manière superficielle.

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