You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:32:28