tRPC同一路由能否配置Query与Mutation?REST迁移问题咨询
tRPC同路径下同时配置Query和Mutation的解决方案
你不能在同一个tRPC路由键下同时挂载query和mutation,这会触发TypeScript重复属性的错误——因为tRPC的路由对象中每个键对应一个独立的Procedure,不允许重复定义。针对你的REST迁移场景,有两种常用处理方式:
方案1:使用子路由拆分操作(推荐)
把原有的/api/auth相关操作拆分为子路由,用语义化的名称区分获取和认证操作:
import { router } from '@trpc/server'; const appRouter = router({ auth: router({ // 对应原GET /api/auth,获取用户认证信息 getInfo: authedProcedure.query(({ ctx }) => ({ account: ctx.account })), // 对应原POST /api/auth,完成用户认证 login: publicProcedure.mutation(({ ctx, input }) => { // 这里写入你的认证逻辑(比如验证账号密码、生成token等) return { foo: 'bar' }; }), }), }); export type AppRouter = typeof appRouter;
前端调用时对应:
- 获取认证信息:
client.auth.getInfo.query() - 执行认证:
client.auth.login.mutate(/* 传入认证参数 */)
方案2:使用顶级路由键区分
如果偏好更贴近REST的命名方式,也可以直接用不同的顶级路由键:
const appRouter = router({ authGet: authedProcedure.query(({ ctx }) => ({ account: ctx.account })), authLogin: publicProcedure.mutation(({ ctx, input }) => ({ foo: 'bar' })), });
但这种方式会让顶级路由列表变得冗长,不如子路由结构清晰,不推荐大规模使用。
补充说明
tRPC的设计逻辑是以操作语义命名路由,而非依赖HTTP方法区分,所以用清晰的操作名称(比如getInfo、login)替代REST的方法+路径模式,能让路由的功能更直观,也更符合tRPC的设计理念。
内容的提问来源于stack exchange,提问作者Evgeny
相关产品推荐
相关产品推荐

