mirror of
https://github.com/ArthurDanjou/trpc-nuxt.git
synced 2026-01-14 20:19:33 +01:00
update directory structure
This commit is contained in:
140
docs/content/1.get-started/2.usage.md
Normal file
140
docs/content/1.get-started/2.usage.md
Normal file
@@ -0,0 +1,140 @@
|
||||
---
|
||||
title: Usage
|
||||
description: tRPC-Nuxt provides first class integration with tRPC.
|
||||
---
|
||||
|
||||
# Usage
|
||||
|
||||
## Recommended file structure
|
||||
|
||||
Recommended but not enforced file structure. This is what you get when starting from [the examples](../main/example-apps.md).
|
||||
|
||||
```graphql
|
||||
.
|
||||
├── server
|
||||
│ ├── api
|
||||
│ │ └── trpc
|
||||
│ │ └── [trpc].ts # <-- tRPC HTTP handler
|
||||
│ │ └── [..]
|
||||
│ ├── trpc
|
||||
│ │ ├── routers
|
||||
│ │ │ ├── index.ts # <-- main app router
|
||||
│ │ │ ├── todo.ts # <-- sub routers
|
||||
│ │ │ └── [..]
|
||||
│ │ ├── context.ts # <-- create app context
|
||||
│ │ └── trpc.ts # <-- procedure helpers
|
||||
├── plugins
|
||||
│ ├── client.ts # <-- tRPC Client as a plugin
|
||||
└── [..]
|
||||
```
|
||||
|
||||
## 1. Create a tRPC router
|
||||
|
||||
Initialize your tRPC backend using the `initTRPC` function and create your first router.
|
||||
|
||||
::code-group
|
||||
|
||||
```ts [server/trpc/trpc.ts]
|
||||
import { TRPCError, initTRPC } from '@trpc/server'
|
||||
|
||||
// Avoid exporting the entire t-object since it's not very
|
||||
// descriptive and can be confusing to newcomers used to t
|
||||
// meaning translation in i18n libraries.
|
||||
const t = initTRPC.create()
|
||||
|
||||
// Base router and procedure helpers
|
||||
export const router = t.router
|
||||
export const publicProcedure = t.procedure
|
||||
```
|
||||
|
||||
```ts [server/trpc/routers/index.ts]
|
||||
import { z } from 'zod'
|
||||
import { publicProcedure, router } from '..'
|
||||
|
||||
export const appRouter = router({
|
||||
hello: publicProcedure
|
||||
.input(
|
||||
z.object({
|
||||
text: z.string().nullish(),
|
||||
}),
|
||||
)
|
||||
.query(({ input }) => {
|
||||
return {
|
||||
greeting: `hello ${input?.text ?? 'world'}`,
|
||||
}
|
||||
}),
|
||||
})
|
||||
|
||||
// export type definition of API
|
||||
export type AppRouter = typeof appRouter
|
||||
```
|
||||
|
||||
```ts [server/api/trpc/[trpc].ts]
|
||||
import { createNuxtApiHandler } from 'trpc-nuxt'
|
||||
import { appRouter } from '../../trpc/routers'
|
||||
|
||||
// export API handler
|
||||
export default createNuxtApiHandler({
|
||||
router: appRouter,
|
||||
createContext: () => ({}),
|
||||
})
|
||||
```
|
||||
|
||||
::
|
||||
|
||||
::alert{type=info}
|
||||
If you need to split your router into several subrouters, you can implement them in the `server/trpc/routers` directory and import and [merge them](https://trpc.io/docs/v10/merging-routers) to a single root `appRouter`.
|
||||
::
|
||||
|
||||
## 2. Create tRPC client plugin
|
||||
|
||||
Create a set of strongly-typed composables using your API's type signature.
|
||||
|
||||
```ts [plugins/client.ts]
|
||||
import { httpBatchLink } from '@trpc/client'
|
||||
import { createTRPCNuxtProxyClient } from 'trpc-nuxt/client'
|
||||
import type { AppRouter } from '~~/server/trpc/routers'
|
||||
|
||||
export default defineNuxtPlugin(() => {
|
||||
const client = createTRPCNuxtProxyClient<AppRouter>({
|
||||
links: [
|
||||
httpBatchLink({
|
||||
/**
|
||||
* If you want to use SSR, you need to use the server's full URL
|
||||
* @link https://trpc.io/docs/ssr
|
||||
**/
|
||||
url: 'http://localhost:3000/api/trpc',
|
||||
}),
|
||||
],
|
||||
})
|
||||
|
||||
return {
|
||||
provide: {
|
||||
client,
|
||||
},
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
## 3. Make API requests
|
||||
|
||||
```vue [pages/index.vue]
|
||||
<script setup lang="ts">
|
||||
const { $client } = useNuxtApp()
|
||||
|
||||
// query and mutate uses useAsyncData under the hood
|
||||
const { data, pending, error } = await $client.hello.query({ text: 'client' })
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="pending">
|
||||
Loading...
|
||||
</div>
|
||||
<div v-else-if="error?.data?.code">
|
||||
Error: {{ error.data.code }}
|
||||
</div>
|
||||
<div v-else>
|
||||
<p>{{ hello.data?.greeting }}</p>
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
Reference in New Issue
Block a user