Skip to main content

Define Router

info
  • A procedure can be viewed as the equivalent of a REST-endpoint.
  • There's no internal difference between queries and mutations apart from semantics.
  • Defining router is the same for queries, mutations, and subscription with the exception that subscriptions need to return a Subscription-instance.

Input validation#

tRPC works out-of-the-box with yup/zod/myzod/custom validators/[..] - see test suite

Example without input#

import * as trpc from '@trpc/server';
// [...]
export const appRouter = trpc
.router<Context>()
// Create procedure at path 'hello'
.query('hello', {
resolve({ ctx }) {
return {
greeting: `hello world`,
};
},
});

With Zod#

import * as trpc from '@trpc/server';
import { z } from 'zod';
// [...]
export const appRouter = trpc.router<Context>().query('hello', {
input: z
.object({
text: z.string().optional(),
})
.optional(),
resolve({ input }) {
return {
greeting: `hello ${input?.text ?? 'world'}`,
};
},
});
export type AppRouter = typeof appRouter;

With Yup#

import * as trpc from '@trpc/server';
import * as yup from 'yup';
// [...]
export const appRouter = trpc.router<Context>().query('hello', {
input: yup.object({
text: yup.string().required(),
}),
resolve({ input }) {
return {
greeting: `hello ${input?.text ?? 'world'}`,
};
},
});
export type AppRouter = typeof appRouter;

Method chaining#

To add multiple endpoints, you must chain the calls

import * as trpc from '@trpc/server';
// [...]
export const appRouter = trpc
.router<Context>()
.query('hello', {
resolve() {
return {
text: `hello world`,
};
},
})
.query('bye', {
resolve() {
return {
text: `goodbye`,
};
},
});
export type AppRouter = typeof appRouter;