Define Routers
To begin building your tRPC-based API, you'll first need to define your router. Once you've mastered the fundamentals, you can customize your routers for more advanced use cases.
Initialize tRPC
You should initialize tRPC exactly once per application. Multiple instances of tRPC will cause issues.
server/trpc.tstsinitTRPC } from '@trpc/server';// You can use any variable name you like.// We use t to keep things simple.constt =initTRPC .create ();export constrouter =t .router ;export constmiddleware =t .middleware ;export constpublicProcedure =t .procedure ;
server/trpc.tstsinitTRPC } from '@trpc/server';// You can use any variable name you like.// We use t to keep things simple.constt =initTRPC .create ();export constrouter =t .router ;export constmiddleware =t .middleware ;export constpublicProcedure =t .procedure ;
You'll notice we are exporting certain methods of the t variable here rather than t itself. This is to establish a certain set of procedures that we will use idiomatically in our codebase.
Defining a router
Next, let's define a router with a procedure to use in our application. We have now created an API "endpoint".
In order for these endpoints to be exposed to the frontend, your Adapter should be configured with your appRouter instance.
server/_app.tststrpc from '@trpc/server';import {publicProcedure ,router } from './trpc';constappRouter =router ({greeting :publicProcedure .query (() => 'hello tRPC v10!'),});// Export only the type of a router!// This prevents us from importing server code on the client.export typeAppRouter = typeofappRouter ;
server/_app.tststrpc from '@trpc/server';import {publicProcedure ,router } from './trpc';constappRouter =router ({greeting :publicProcedure .query (() => 'hello tRPC v10!'),});// Export only the type of a router!// This prevents us from importing server code on the client.export typeAppRouter = typeofappRouter ;
Advanced usage
When initializing your router, tRPC allows you to:
- Setup request contexts
- Assign metadata to procedures
- Format and handle errors
- Transform data as needed
- Customize the runtime configuration
You can use method chaining to customize your t-object on initialization. For example:
ts
ts
Runtime Configuration
ts
ts