Utdatavalidering
Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →
tRPC ger dig automatisk typsäkerhet för utdata utan att du behöver lägga till en valideringsfunktion. Ibland kan det dock vara användbart att strikt definiera utdatatypen för att förhindra att känslig data läcker ut.
På samma sätt som input: kan du lägga till en output:-validering till query()- och mutation()-metoderna i routern. Utdatavalidatorn anropas med den nyttolast som returneras av resolve()-funktionen.
När en output-validator har definierats förväntas dess härledda typ vara returtypen för resolve()-funktionen.
- Detta är helt frivilligt och endast om du vill säkerställa att du inte av misstag läcker ut känslig data
- Om utdatavalidering misslyckas kommer servern att svara med ett
INTERNAL_SERVER_ERROR
Exempel
tRPC fungerar direkt utan konfiguration med yup/superstruct/zod/myzod/egna valideringsbibliotek/[..] - se test suite
Med 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;
Med 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;
Med 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;
Med anpassad valideringsfunktion
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;