Validation des sorties
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 →
tRPC vous offre une sécurité de type automatique pour les sorties sans nécessiter de validateur supplémentaire. Cependant, il peut être utile de définir strictement le type de sortie pour éviter la fuite de données sensibles.
À l'instar de input:, vous pouvez ajouter une validation output: aux méthodes de route query() et mutation(). Le validateur de sortie est invoqué avec la charge utile renvoyée par la fonction resolve().
Lorsqu'un validateur output est défini, son type inféré est attendu comme type de retour de la fonction resolve().
- Ceci est entièrement optionnel et ne sert qu'à garantir que vous ne divulguez rien accidentellement
- Si la validation de sortie échoue, le serveur répondra par une
INTERNAL_SERVER_ERROR.
Exemples
tRPC fonctionne immédiatement avec yup/superstruct/zod/myzod/validateurs personnalisés/[..] - voir la suite de tests
Avec Zod
tsximport * as trpc from '@trpc/server';import { z } from 'zod';// [...]export const appRouter = trpc.router<Context>().query('hello', {output: z.object({greeting: z.string(),}),// expects return type of { greeting: string }resolve() {return {greeting: 'hello!',};},});export type AppRouter = typeof appRouter;
tsximport * as trpc from '@trpc/server';import { z } from 'zod';// [...]export const appRouter = trpc.router<Context>().query('hello', {output: z.object({greeting: z.string(),}),// expects return type of { greeting: string }resolve() {return {greeting: 'hello!',};},});export type AppRouter = typeof appRouter;
Avec Yup
tsximport * as trpc from '@trpc/server';import * as yup from 'yup';// [...]export const appRouter = trpc.router<Context>().query('hello', {output: yup.object({greeting: yup.string().required(),}),resolve() {return { greeting: 'hello!' };},});export type AppRouter = typeof appRouter;
tsximport * as trpc from '@trpc/server';import * as yup from 'yup';// [...]export const appRouter = trpc.router<Context>().query('hello', {output: yup.object({greeting: yup.string().required(),}),resolve() {return { greeting: 'hello!' };},});export type AppRouter = typeof appRouter;
Avec Superstruct
tsximport * as trpc from '@trpc/server';import * as t from 'superstruct';// [...]export const appRouter = trpc.router<Context>().query('hello', {input: t.string(),output: t.object({greeting: t.string(),}),resolve({ input }) {return { greeting: input };},});export type AppRouter = typeof appRouter;
tsximport * as trpc from '@trpc/server';import * as t from 'superstruct';// [...]export const appRouter = trpc.router<Context>().query('hello', {input: t.string(),output: t.object({greeting: t.string(),}),resolve({ input }) {return { greeting: input };},});export type AppRouter = typeof appRouter;
Avec un validateur personnalisé
tsximport * as trpc from '@trpc/server';import * as t from 'superstruct';// [...]export const appRouter = trpc.router<Context>().query('hello', {output: (value: any) => {if (value && typeof value.greeting === 'string') {return { greeting: value.greeting };}throw new Error('Greeting not found');},// expects return type of { greeting: string }resolve() {return { greeting: 'hello!' };},});export type AppRouter = typeof appRouter;
tsximport * as trpc from '@trpc/server';import * as t from 'superstruct';// [...]export const appRouter = trpc.router<Context>().query('hello', {output: (value: any) => {if (value && typeof value.greeting === 'string') {return { greeting: value.greeting };}throw new Error('Greeting not found');},// expects return type of { greeting: string }resolve() {return { greeting: 'hello!' };},});export type AppRouter = typeof appRouter;