0Pricing
React Academy · 课时

将 tRPC 与 React Query 和身份验证集成

配置 tRPC 的 React Query 集成,添加身份验证标头,并处理受保护的过程。

将 tRPC 与 React Query 和身份验证集成 是 CoddyKit 上的免费 React Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

tRPC 上下文:每个请求的数据

tRPC 上下文是由 createTRPCContext 函数为每个请求新建的对象。它可以包含数据库客户端、经过身份验证的会话、请求标头,或您的过程所需的任何请求专属数据。

上下文创建会在任何过程执行之前运行,因此非常适合在此处设置身份验证和数据库连接。

通过 NextAuth 将会话添加到上下文

在 createTRPCContext 中,请从 next-auth/next 调用 getServerSession(authOptions)。将结果附加到上下文对象:return { session: await getServerSession(authOptions), db }。现在所有过程都可以访问 ctx.session。

如果会话为 null,则用户未通过身份验证。过程可以据此有条件地返回数据或抛出错误。

创建受保护的过程

定义一个检查 ctx.session 的中间件:const isAuthenticated = t.middleware(({ ctx, next }) => { if (!ctx.session) throw new TRPCError({ code: 'UNAUTHORIZED' }); return next({ ctx: { session: ctx.session } }); })。

next() 调用会将经过收窄的上下文(会话不为空)传递给后续中间件和过程处理函数。

protectedProcedure 定义

将中间件与 publicProcedure 组合起来:const protectedProcedure = publicProcedure.use(isAuthenticated)。现在,使用 protectedProcedure.query() 或 protectedProcedure.mutation() 定义的任何处理函数都会自动在 ctx 中获得非空会话。

TypeScript 能推断出受保护过程中 ctx.session 不为空,因为如果中间件检查失败,处理函数就不会被执行。

使用 protectedProcedure

对于要求身份验证的端点,请将 publicProcedure 替换为 protectedProcedure:protectedProcedure.query(({ ctx }) => getProfileFor(ctx.session.user.id))。TypeScript 知道此处的 ctx.session 不为空,因此无需进行空值检查即可安全访问 ctx.session.user.id。

未通过身份验证的请求会在处理函数执行前自动收到 401 UNAUTHORIZED 响应。

从客户端发送身份验证标头

向 httpBatchLink 传递一个标头函数:links: [httpBatchLink({ url: '/api/trpc', headers: async () => { const token = await getToken(); return { Authorization: 'Bearer ' + token }; } })]。该函数会在每一批请求之前运行。

当您从 React Native 客户端或任何自行管理身份验证令牌的非 Next.js 客户端对 tRPC 进行身份验证时,会使用这种方式。

使用 createServerSideHelpers 进行服务器端渲染

对于 Next.js Pages Router 中的 SSR,请创建服务器端辅助工具:createServerSideHelpers({ router: appRouter, ctx: await createContext({ req, res }) })。在 getServerSideProps 中使用 helpers.post.getAll.prefetch()。

使用 dehydrate(queryClient) 将预获取的状态进行脱水,并将其作为属性传递。在客户端,QueryClient 会从该状态完成水合,从而避免首次加载时再次获取数据。

为 SSR 水合 tRPC 查询缓存

请使用来自 @tanstack/react-query 的 Hydrate 包裹 Next.js 的 _app.tsx。将 pageProps.trpcState 传递给 state 属性。这样,客户端就能根据序列化的服务器状态恢复预获取的查询缓存。

通过这种设置,用户在初次导航时会立即看到内容完整的页面,无需等待客户端加载旋转指示器。

TRPCError 代码

请使用恰当的 HTTP 语义代码抛出 TRPCError:UNAUTHORIZED(401)、FORBIDDEN(403)、NOT_FOUND(404)、BAD_REQUEST(400)、INTERNAL_SERVER_ERROR(500)。tRPC 客户端会将这些代码映射为钩子结果中相应的错误状态。

message 字段可以包含面向用户的详细信息,但在生产环境的错误消息中应避免泄露敏感的服务器信息。

tRPC 与 React Native

tRPC 可以与使用相同 AppRouter 类型的 React Native 客户端配合使用。请将 httpBatchLink 替换为 httpLink(RN fetch 的工作方式相同),并配置身份验证标头。@trpc/react-query 适配器与网页端设置的工作方式完全相同。

这意味着单一代码仓库可以在 Next.js 网页应用和 Expo React Native 应用之间共享一个 tRPC 路由器,并在两端都获得完整的类型安全。

基于角色的授权

请扩展中间件模式以实现基于角色的访问控制:检查 ctx.session.user.role,如果角色权限不足,则抛出 TRPCError({ code: 'FORBIDDEN' })。请创建 adminProcedure = publicProcedure.use(isAdmin),用于仅限管理员访问的端点。

对于复杂的授权,可以叠加多个中间件:publicProcedure.use(isAuthenticated).use(hasFeatureFlag('beta')).query(...)。

tRPC 受保护的过程

在 tRPC 中,如何创建受保护的过程来强制执行身份验证?

课程回顾

tRPC 上下文按请求创建,其中包含会话、数据库客户端及其他请求范围内的数据。受保护的过程通过将检查会话的中间件使用 .use() 组合到 publicProcedure 上来创建。服务器端渲染使用 createServerSideHelpers 进行预获取,并使用 Hydrate 在客户端恢复缓存。

对于非 Next.js 客户端,请通过 httpBatchLink 的 headers 选项传递身份验证标头。

常见问题解答

「将 tRPC 与 React Query 和身份验证集成」课时是免费的吗?

是的 — 「将 tRPC 与 React Query 和身份验证集成」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「将 tRPC 与 React Query 和身份验证集成」这节课中我会学到什么?

配置 tRPC 的 React Query 集成,添加身份验证标头,并处理受保护的过程。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「将 tRPC 与 React Query 和身份验证集成」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. tRPC 解决的问题
  2. 在 React 和 Next.js 中配置 tRPC
  3. 查询、变更与订阅
  4. 将 tRPC 与 React Query 和身份验证集成
← 返回 React Academy