Définir des procédures
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 :
tsimport {initTRPC } from '@trpc/server';import {z } from 'zod';constt =initTRPC .context <{signGuestBook : () =>Promise <void> }>().create ();export constrouter =t .router ;export constpublicProcedure =t .procedure ;constappRouter =router ({// Queries are the best place to fetch datahello :publicProcedure .query (() => {return {message : 'hello world',};}),// Mutations are the best place to do things like updating a databasegoodbye :publicProcedure .mutation (async (opts ) => {awaitopts .ctx .signGuestBook ();return {message : 'goodbye!',};}),});
tsimport {initTRPC } from '@trpc/server';import {z } from 'zod';constt =initTRPC .context <{signGuestBook : () =>Promise <void> }>().create ();export constrouter =t .router ;export constpublicProcedure =t .procedure ;constappRouter =router ({// Queries are the best place to fetch datahello :publicProcedure .query (() => {return {message : 'hello world',};}),// Mutations are the best place to do things like updating a databasegoodbye :publicProcedure .mutation (async (opts ) => {awaitopts .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.
tsexport constauthorizedProcedure =publicProcedure .input (z .object ({townName :z .string () })).use ((opts ) => {if (opts .input .townName !== 'Pucklechurch') {throw newTRPCError ({code : 'FORBIDDEN',message : "We don't take kindly to out-of-town folk",});}returnopts .next ();});export constappRouter =t .router ({hello :authorizedProcedure .query (() => {return {message : 'hello world',};}),goodbye :authorizedProcedure .mutation (async (opts ) => {awaitopts .ctx .signGuestBook ();return {message : 'goodbye!',};}),});
tsexport constauthorizedProcedure =publicProcedure .input (z .object ({townName :z .string () })).use ((opts ) => {if (opts .input .townName !== 'Pucklechurch') {throw newTRPCError ({code : 'FORBIDDEN',message : "We don't take kindly to out-of-town folk",});}returnopts .next ();});export constappRouter =t .router ({hello :authorizedProcedure .query (() => {return {message : 'hello world',};}),goodbye :authorizedProcedure .mutation (async (opts ) => {awaitopts .ctx .signGuestBook ();return {message : 'goodbye!',};}),});