Aller au contenu principal
Version : 11.x

Fusion de routeurs

Traduction Bêta Non Officielle

Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →

Écrire tout le code d'API dans un même fichier peut devenir peu pratique. Il est facile de fusionner des routeurs ensemble afin de les diviser.

Fusion avec des routeurs enfants

routers/user.ts
ts
import { router, publicProcedure } from '../trpc';
import { z } from 'zod';
 
export const userRouter = router({
list: publicProcedure.query(() => {
// [..]
return [];
}),
});
routers/user.ts
ts
import { router, publicProcedure } from '../trpc';
import { z } from 'zod';
 
export const userRouter = router({
list: publicProcedure.query(() => {
// [..]
return [];
}),
});
routers/post.ts
ts
import { router, publicProcedure } from '../trpc';
import { z } from 'zod';
 
export const postRouter = router({
create: publicProcedure
.input(
z.object({
title: z.string(),
}),
)
.mutation((opts) => {
const { input } = opts;
// [...]
}),
list: publicProcedure.query(() => {
// ...
return [];
}),
});
routers/post.ts
ts
import { router, publicProcedure } from '../trpc';
import { z } from 'zod';
 
export const postRouter = router({
create: publicProcedure
.input(
z.object({
title: z.string(),
}),
)
.mutation((opts) => {
const { input } = opts;
// [...]
}),
list: publicProcedure.query(() => {
// ...
return [];
}),
});
routers/_app.ts
ts
import { router } from '../trpc';
 
import { userRouter } from './user';
import { postRouter } from './post';
 
const appRouter = router({
user: userRouter,
post: postRouter,
});
 
appRouter.user
(property) user: DecorateCreateRouterOptions<{ list: QueryProcedure<{ input: void; output: never[]; meta: object; }>; }>
 
appRouter.post
(property) post: DecorateCreateRouterOptions<{ create: MutationProcedure<{ input: { title: string; }; output: void; meta: object; }>; list: QueryProcedure<{ input: void; output: never[]; meta: object; }>; }>
 
export type AppRouter = typeof appRouter;
routers/_app.ts
ts
import { router } from '../trpc';
 
import { userRouter } from './user';
import { postRouter } from './post';
 
const appRouter = router({
user: userRouter,
post: postRouter,
});
 
appRouter.user
(property) user: DecorateCreateRouterOptions<{ list: QueryProcedure<{ input: void; output: never[]; meta: object; }>; }>
 
appRouter.post
(property) post: DecorateCreateRouterOptions<{ create: MutationProcedure<{ input: { title: string; }; output: void; meta: object; }>; list: QueryProcedure<{ input: void; output: never[]; meta: object; }>; }>
 
export type AppRouter = typeof appRouter;

Fusion avec t.mergeRouters

Si vous préférez avoir toutes vos procédures dans un seul espace de noms plat, vous pouvez utiliser t.mergeRouters à la place.

routers/user.ts
ts
import { router, publicProcedure } from '../trpc';
import { z } from 'zod';
 
export const userRouter = router({
userList: publicProcedure.query(() => {
// [..]
return [];
}),
});
routers/user.ts
ts
import { router, publicProcedure } from '../trpc';
import { z } from 'zod';
 
export const userRouter = router({
userList: publicProcedure.query(() => {
// [..]
return [];
}),
});
routers/post.ts
ts
import { router, publicProcedure } from '../trpc';
import { z } from 'zod';
 
export const postRouter = router({
postCreate: publicProcedure
.input(
z.object({
title: z.string(),
}),
)
.mutation((opts) => {
const { input } = opts;
// [...]
}),
postList: publicProcedure.query(() => {
// ...
return [];
}),
});
routers/post.ts
ts
import { router, publicProcedure } from '../trpc';
import { z } from 'zod';
 
export const postRouter = router({
postCreate: publicProcedure
.input(
z.object({
title: z.string(),
}),
)
.mutation((opts) => {
const { input } = opts;
// [...]
}),
postList: publicProcedure.query(() => {
// ...
return [];
}),
});
routers/_app.ts
ts
import { mergeRouters } from '../trpc';
 
import { userRouter } from './user';
import { postRouter } from './post';
 
const appRouter = mergeRouters(userRouter, postRouter);
const appRouter: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<{ postCreate: MutationProcedure<{ input: { title: string; }; output: void; meta: object; }>; postList: QueryProcedure<{ input: void; output: never[]; meta: object; }>; }> & DecorateCreateRouterOptions<{ userList: QueryProcedure<{ input: void; output: never[]; meta: object; }>; }>>
 
export type AppRouter = typeof appRouter;
routers/_app.ts
ts
import { mergeRouters } from '../trpc';
 
import { userRouter } from './user';
import { postRouter } from './post';
 
const appRouter = mergeRouters(userRouter, postRouter);
const appRouter: BuiltRouter<{ ctx: object; meta: object; errorShape: DefaultErrorShape; transformer: false; }, DecorateCreateRouterOptions<{ postCreate: MutationProcedure<{ input: { title: string; }; output: void; meta: object; }>; postList: QueryProcedure<{ input: void; output: never[]; meta: object; }>; }> & DecorateCreateRouterOptions<{ userList: QueryProcedure<{ input: void; output: never[]; meta: object; }>; }>>
 
export type AppRouter = typeof appRouter;

Chargement dynamique de routeurs

Vous pouvez utiliser la fonction lazy pour charger dynamiquement vos routeurs. Cela peut être utile pour réduire les démarrages à froid de votre application. Il n'y a aucune différence dans la manière dont vous utilisez le routeur après son chargement paresseux par rapport à un routeur normal.

routers/greeting.ts
ts
import { router, publicProcedure } from '../trpc';
 
export const greetingRouter = router({
hello: publicProcedure.query(() => 'world'),
});
routers/greeting.ts
ts
import { router, publicProcedure } from '../trpc';
 
export const greetingRouter = router({
hello: publicProcedure.query(() => 'world'),
});
routers/user.ts
ts
import { router, publicProcedure } from '../trpc';
 
export const userRouter = router({
list: publicProcedure.query(() => ['John', 'Jane', 'Jim']),
});
routers/user.ts
ts
import { router, publicProcedure } from '../trpc';
 
export const userRouter = router({
list: publicProcedure.query(() => ['John', 'Jane', 'Jim']),
});
routers/_app.ts
ts
import { lazy } from '@trpc/server';
import { router } from '../trpc';
 
export const appRouter = router({
// Option 1: Short-hand when the module has exactly 1 router exported
greeting: lazy(() => import('./greeting.js')),
// Option 2: if exporting more than 1 router
user: lazy(() => import('./user.js').then((m) => m.userRouter)),
});
export type AppRouter = typeof appRouter;
routers/_app.ts
ts
import { lazy } from '@trpc/server';
import { router } from '../trpc';
 
export const appRouter = router({
// Option 1: Short-hand when the module has exactly 1 router exported
greeting: lazy(() => import('./greeting.js')),
// Option 2: if exporting more than 1 router
user: lazy(() => import('./user.js').then((m) => m.userRouter)),
});
export type AppRouter = typeof appRouter;