Aller au contenu principal
Version : 10.x

Définir des procédures

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 →

Une procédure est une fonction exposée au client, qui peut être de l'un des types suivants :

  • une Query - utilisée pour récupérer des données, généralement sans les modifier

  • une Mutation - utilisée pour envoyer des données, souvent pour créer/mettre à jour/supprimer

  • une Subscription - vous n'en aurez peut-être pas besoin, et nous avons une documentation dédiée

Les procédures dans tRPC sont des primitives très flexibles pour créer des fonctions backend. Elles utilisent un modèle de construction immuable, ce qui signifie que vous pouvez créer des procédures de base réutilisables partageant des fonctionnalités entre plusieurs procédures.

Écrire des procédures

L'objet t créé lors de la configuration tRPC retourne une t.procedure initiale sur laquelle toutes les autres procédures sont construites :

ts
import { initTRPC } from '@trpc/server';
import { z } from 'zod';
 
const t = initTRPC.context<{ signGuestBook: () => Promise<void> }>().create();
 
export const router = t.router;
export const publicProcedure = t.procedure;
 
const appRouter = router({
// Queries are the best place to fetch data
hello: publicProcedure.query(() => {
return {
message: 'hello world',
};
}),
 
// Mutations are the best place to do things like updating a database
goodbye: publicProcedure.mutation(async (opts) => {
await opts.ctx.signGuestBook();
 
return {
message: 'goodbye!',
};
}),
});
ts
import { initTRPC } from '@trpc/server';
import { z } from 'zod';
 
const t = initTRPC.context<{ signGuestBook: () => Promise<void> }>().create();
 
export const router = t.router;
export const publicProcedure = t.procedure;
 
const appRouter = router({
// Queries are the best place to fetch data
hello: publicProcedure.query(() => {
return {
message: 'hello world',
};
}),
 
// Mutations are the best place to do things like updating a database
goodbye: publicProcedure.mutation(async (opts) => {
await opts.ctx.signGuestBook();
 
return {
message: 'goodbye!',
};
}),
});

Procédures de base réutilisables

En règle générale, nous vous recommandons de renommer et d'exporter t.procedure en tant que publicProcedure, ce qui vous permet ensuite de créer d'autres procédures nommées pour des cas d'usage spécifiques et de les exporter également. Ce modèle appelé "procédures de base" est un mécanisme clé pour la réutilisation de code et de comportements dans tRPC ; presque toutes les applications en auront besoin.

L'exemple ci-dessous prend une entrée utilisateur et les autorise comme des villageois protecteurs. Il s'agit évidemment d'un exemple artificiel pour simplifier, et non d'une méthode appropriée pour autoriser un utilisateur de manière sécurisée. En pratique, vous voudrez probablement utiliser une combinaison d'En-têtes, de Contexte, de Middleware et de Métadonnées pour authentifier et autoriser vos utilisateurs.

ts
export const authorizedProcedure = publicProcedure
.input(z.object({ townName: z.string() }))
.use((opts) => {
if (opts.input.townName !== 'Pucklechurch') {
throw new TRPCError({
code: 'FORBIDDEN',
message: "We don't take kindly to out-of-town folk",
});
}
 
return opts.next();
});
 
export const appRouter = t.router({
hello: authorizedProcedure.query(() => {
return {
message: 'hello world',
};
}),
goodbye: authorizedProcedure.mutation(async (opts) => {
await opts.ctx.signGuestBook();
 
return {
message: 'goodbye!',
};
}),
});
ts
export const authorizedProcedure = publicProcedure
.input(z.object({ townName: z.string() }))
.use((opts) => {
if (opts.input.townName !== 'Pucklechurch') {
throw new TRPCError({
code: 'FORBIDDEN',
message: "We don't take kindly to out-of-town folk",
});
}
 
return opts.next();
});
 
export const appRouter = t.router({
hello: authorizedProcedure.query(() => {
return {
message: 'hello world',
};
}),
goodbye: authorizedProcedure.mutation(async (opts) => {
await opts.ctx.signGuestBook();
 
return {
message: 'goodbye!',
};
}),
});