2023-02-04 22:37:15 +08:00
# tRPC Server Middleware for Hono
2025-03-19 16:53:11 +08:00
[](https://codecov.io/github/honojs/middleware)
2023-02-04 22:37:15 +08:00
tRPC Server Middleware adapts a [tRPC ](https://trpc.io ) server as middleware for Hono.
Hono works on almost any JavaScript runtime, including Cloudflare Workers, Deno, and Bun. So, with this middleware, the same code will run as tRPC server.
## Install
```
npm install @hono/trpc -server
```
## Usage
Router:
```ts
import { initTRPC } from '@trpc/server'
import { z } from 'zod'
const t = initTRPC.create()
const publicProcedure = t.procedure
const router = t.router
export const appRouter = router({
hello: publicProcedure.input(z.string().nullish()).query(({ input }) => {
return `Hello ${input ?? 'World'}!`
}),
})
export type AppRouter = typeof appRouter
```
Hono app using tRPC Server Middleware:
```ts
import { Hono } from 'hono'
import { trpcServer } from '@hono/trpc-server' // Deno 'npm:@hono/trpc-server'
import { appRouter } from './router'
const app = new Hono()
app.use(
'/trpc/*',
trpcServer({
router: appRouter,
})
)
export default app
```
Client:
```ts
import { createTRPCProxyClient, httpBatchLink } from '@trpc/client'
import type { AppRouter } from './router'
const client = createTRPCProxyClient< AppRouter > ({
links: [
httpBatchLink({
url: 'http://localhost:8787/trpc',
}),
],
})
console.log(await client.hello.query('Hono'))
```
2024-04-27 10:46:09 +08:00
## Context
You can also access `c.env` from hono context from the trpc `ctx` . eg. here's an example using cloudflare D1 binding available as `env.DB`
```ts
import { initTRPC } from '@trpc/server'
import { z } from 'zod'
type Env = {
2025-03-19 16:53:11 +08:00
DB: D1Database
2024-04-27 10:46:09 +08:00
}
type HonoContext = {
2025-03-19 16:53:11 +08:00
env: Env
}
2024-04-27 10:46:09 +08:00
const t = initTRPC.context< HonoContext > ().create()
const publicProcedure = t.procedure
const router = t.router
export const appRouter = router({
usersCount: publicProcedure.query(({ input, ctx }) => {
2025-03-19 16:53:11 +08:00
const result = await ctx.env.DB.prepare('SELECT count(*) from user;').all()
return result.results[0].count
2024-04-27 10:46:09 +08:00
}),
})
export type AppRouter = typeof appRouter
```
For further control, you can optionally specify a `createContext` that in this case will receive the hono context as 2nd argument:
```ts
app.use(
'/trpc/*',
trpcServer({
router: appRouter,
createContext: (_opts, c) => ({
// c is the hono context
var1: c.env.MY_VAR1,
var2: c.req.header('X-VAR2'),
2025-03-19 16:53:11 +08:00
}),
2024-04-27 10:46:09 +08:00
})
)
```
2025-03-19 16:53:11 +08:00
2024-05-23 21:03:33 +08:00
## Custom Endpoints
To set up custom endpoints ensure the endpoint parameter matches the middleware's path. This alignment allows `@trpc/server` to accurately extract your procedure paths.
```ts
import { Hono } from 'hono'
import { trpcServer } from '@hono/trpc-server'
import { appRouter } from './router'
const app = new Hono()
// Custom endpoint configuration
app.use(
'/api/trpc/*',
trpcServer({
endpoint: '/api/trpc',
router: appRouter,
})
)
export default app
```
2024-04-27 10:46:09 +08:00
2023-02-04 22:37:15 +08:00
## Author
Yusuke Wada < https: / / github . com / yusukebe >
## License
MIT