跳至主内容
版本:11.x

合并路由器

非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

将所有 API 代码都写在同一文件中会变得难以管理。通过合并路由器来拆分它们非常容易。

与子路由器合并

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;

使用 t.mergeRouters 合并

如果您希望将所有过程扁平化到单个命名空间中,可以使用 t.mergeRouters 方法替代

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;

动态加载路由器

您可以使用 lazy 函数动态加载路由器。这有助于减少应用程序的冷启动时间。路由器经惰性加载后,其使用方式与普通路由器完全一致。

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;