mirror of
https://github.com/ArthurDanjou/trpc-nuxt.git
synced 2026-01-14 12:14:40 +01:00
2.2 KiB
2.2 KiB
tRPC-Nuxt
End-to-end typesafe APIs with tRPC.io in Nuxt applications.
Install
npm i trpc-nuxt -D
// nuxt.config.ts
import { defineNuxtConfig } from 'nuxt'
export default defineNuxtConfig({
modules: ['trpc-nuxt'],
})
Usage
Create your tRPC routes and context under ~/trpc/index.ts:
// ~/trpc/index.ts
import type { inferAsyncReturnType } from '@trpc/server'
import * as trpc from '@trpc/server'
export const router = trpc
.router<inferAsyncReturnType<typeof createContext>>()
// queries and mutations...
.query('hello', {
resolve: () => 'world',
})
.query('bye', {
resolve() {
return {
text: 'goodbye',
}
},
})
// optional
export const createContext = () => {
// ...
return {
/** context data */
}
}
// optional
export const responseMeta = () => {
// ...
return {
// { headers: ... }
}
}
Use the client like so:
<script setup lang="ts">
const client = useClient()
const greeting = await client.query('hello');
console.log(greeting); // => 👈 world
const farewell = await client.query('bye');
console.log(farewell); // => 👈 goodbye
</script>
Recipes
Input validation
With Zod
// ~/trpc/index.ts
import { z } from 'zod'
export const router = trpc
.router()
.mutation('createUser', {
// validate input with Zod
input: z.object({
name: z.string().min(5)
}),
async resolve(req) {
// use your ORM of choice
return await UserModel.create({
data: req.input,
})
},
})
With Yup
// ~/trpc/index.ts
import { z } from 'zod'
export const router = trpc
.router()
.mutation('createUser', {
// validate input with Zod
input: yup.object({
name: yup.string().required(),
}),
async resolve(req) {
// use your ORM of choice
return await UserModel.create({
data: req.input,
})
},
})
Learn more about tRPC.io here.