如何用 tRPC errorFormatter 把 Zod 校验错误以类型安全方式传给客户端展示

发布时间:2026/11/9 13:22:37

如何用 tRPC errorFormatter 把 Zod 校验错误以类型安全方式传给客户端展示 如何用 tRPC errorFormatter 把 Zod 校验错误以类型安全方式传给客户端展示【免费下载链接】trpc‍♀️ Move Fast and Break Nothing. End-to-end typesafe APIs made easy.项目地址: https://gitcode.com/GitHub_Trending/tr/trpc假设你的 tRPC API 用 Zod 校验了 procedure 的入参。当客户端提交了非法输入时默认响应里只有一句password must be at least 4 characters这样的通用 message拿不到“哪个字段、什么错误”的结构化信息也就没法在表单里逐条渲染。本文的目标就是在服务端用initTRPC的errorFormatter把ZodError的flatten()结果放进错误对象的data里并让这份结构一路推导infer到 React 客户端使mutation.error.data.zodError在编辑器里是具体类型而不是unknown从而可以直接读取字段并展示。整条路径依据 error formatting 文档给出的服务端errorFormatter与 React 用法示例入参与依赖安装分别参考 validators 和 React 集成 setup。前提条件按 React 集成 setup 的说明这套 React 集成需要安装以下依赖trpc/react-query依赖tanstack/react-querynpm install trpc/server trpc/client trpc/react-query tanstack/react-query此外服务端示例用到了zod因为示例中的入参校验基于 Zod。服务端示例里用到了initTRPC、ZodError、z分别来自trpc/server和zod。服务端在 initTRPC.create 里挂 errorFormattererrorFormatter在initTRPC.create()里配置。文档说明router 里的错误格式会一路推导到客户端The error formatting in your router will be inferred all the way to your client这正是类型安全的关键——你在服务端返回的data结构决定了客户端能读到什么类型。下面这段是 error formatting 文档中 React 示例所给出的完整服务端代码server.tsimport { initTRPC } from trpc/server; import { ZodError } from zod; import { z } from zod; const t initTRPC.create({ errorFormatter(opts) { const { shape, error } opts; return { ...shape, data: { ...shape.data, zodError: error.code BAD_REQUEST error.cause instanceof ZodError ? error.cause.flatten() : null, }, }; }, }); export const appRouter t.router({ addPost: t.procedure.input(z.object({ title: z.string() })).mutation(({ input }) input), }); export type AppRouter typeof appRouter;几个需要理解的点都来自 error formatting 文档errorFormatter(opts)收到的opts包含error、type、path、input、ctx、shape其中shape是{ message: string; code: number; data: unknown }。error.cause instanceof ZodError配合error.code BAD_REQUEST用来识别“这是入参校验失败”。只有命中该条件时才填充zodError否则为null。这里用...shape.data保留了默认错误数据的字段。默认的DefaultErrorData含code、httpStatus、path?以及仅开发环境出现的stack?。也就是说errorFormatter是在默认错误结构之上追加zodError字段而不是替换整个响应。默认错误结构可以对照 error handling 文档给出的入参错误示例code为-32600、data.code为BAD_REQUEST、data.httpStatus为400。客户端创建 hooks 并读取推导出来的错误在客户端用一个文件导出createTRPCReactAppRouter()创建的trpc对象它从服务端的AppRouter类型推导出所有 hook来自文档中的utils/trpc.tsximport { createTRPCReact } from trpc/react-query; import type { AppRouter } from ../server; export const trpc createTRPCReactAppRouter();然后在组件里用useMutation触发那个带 Zod 输入的 procedure并读取mutation.error.data.zodError。下面是文档中components/MyComponent.tsx的用法import { useEffect } from react; import { trpc } from ../utils/trpc; export function MyComponent() { const mutation trpc.addPost.useMutation(); useEffect(() { mutation.mutate({ title: example }); }, []); if (mutation.error?.data?.zodError) { // zodError will be inferred return ( preError: {JSON.stringify(mutation.error.data.zodError, null, 2)}/pre ); } return [...]/; }说明useEffect里的mutation.mutate(...)是文档用来触发一次调用、从而走到错误分支的写法实际项目里通常由用户操作触发 mutation。末尾的[...]/是文档里“组件其余 UI”的占位写法替换成你组件正常的返回内容即可。关键在if (mutation.error?.data?.zodError)由于服务端errorFormatter的返回结构被推导到了客户端mutation.error.data.zodError在这里是ZodError.flatten()的结构类型而不是unknown因此可以直接按字段读取并展示。结果验证文档给出的判断方式有两层类型层面——文档明确注释 “zodError will be inferred”即mutation.error.data.zodError由服务端errorFormatter的返回类型推导而来。在编辑器里悬停或访问其子字段时你会得到flatten()的结构而不是unknown这是“类型安全传给客户端”的直接体现。运行时层面——当入参不满足 Zod schema 时服务端返回BAD_REQUEST且error.cause是ZodErrorif (mutation.error?.data?.zodError)分支命中组件用JSON.stringify(mutation.error.data.zodError, null, 2)渲染出该错误对象。限制与说明errorFormatter的zodError只在error.code BAD_REQUEST error.cause instanceof ZodError时填充否则为null。它针对的是入参校验失败validators 文档指出输出校验失败会以INTERNAL_SERVER_ERROR响应不会被这里的zodError覆盖。默认错误数据中的stack只在开发环境出现error handling 说明initTRPC.create()默认把isDev设为process.env.NODE_ENV ! production需要确定性行为时可手动传isDev。tRPC 兼容 JSON-RPC 2.0shape.code是数字如-32600而data.code是BAD_REQUEST这类TRPC_ERROR_CODE_KEY两者不是同一字段读取时注意区分。更多错误码表与TRPCError、onError的用法见 error handlinginferRouterInputs/inferRouterOutputs等从AppRouter推导类型的手动方式见 Inferring Types。【免费下载链接】trpc‍♀️ Move Fast and Break Nothing. End-to-end typesafe APIs made easy.项目地址: https://gitcode.com/GitHub_Trending/tr/trpc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/9 13:22:36

千笔与云笔AI降AI率实测:从78%到19%的改写差异

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/7 9:43:52

3步快速把SystemInformer切成中文界面:多语言配置实战

3步快速把SystemInformer切成中文界面:多语言配置实战 【免费下载链接】systeminformer A free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars & Solution…

2026/11/9 13:20:54

工地太忙根本没时间复习考试?官方回应考电工证报名地点怎么选

工地太忙根本没时间复习考试?官方回应考电工证报名地点怎么选 工地太忙根本没时间复习考试,这是很多一线工人的真实写照,尤其是从事电工作业的朋友,电工证不仅是上岗的“通行证”,更是职业发展的“跳板”。然而,随着应急管理部门对特种作业操作证的规范…

2026/11/9 13:20:54

中级维修电工证有限期怎么延期?保姆级教程教你搞定

中级维修电工证有限期怎么延期?保姆级教程教你搞定 证书过期了不知道怎么复审延期?别慌!这篇文章就是你的 保姆级教程 ,手把手教你解决中级维修电工证有限期的问题,还能顺带了解低压电工证能挣多少钱,避免你再踩坑。…

2026/11/9 13:20:54

云南电工证去哪打印 上岗必备指南:考证不迷路,求职不慌张

云南电工证去哪打印 上岗必备指南:考证不迷路,求职不慌张 你急需特种作业证才能上岗找工作,可偏偏不知道云南电工证去哪打印,还担心能不能顺利考下来?别急,本文就为你扒一扒电工证的真相,带你一步步搞懂从报名到打印的全流程,帮你避开坑,拿下这本“…

2026/11/9 13:20:54

深职电工证培训官方回应实操考试心里没底怕挂科怎么办

深职电工证培训官方回应实操考试心里没底怕挂科怎么办 实操考试心里没底怕挂科?这是很多准备报考深职电工证培训学员最真实的顾虑。尤其是面对高压电工证、低压电工证这类含金量高的证书,一不小心就可能因为操作不规范、流程不熟悉而挂科。别急,…

2026/11/9 13:15:52

考电工证什么级好考在哪考证书过期了不知道怎么复审延期

考电工证什么级好考在哪考证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期,这是很多电工从业者头疼的问题。很多人在拿到电工证后,因为工作变动、考证不及时、甚至对复审流程不了解,导致证书失效,进而影响到工作和职业发展。如果你也在经历这…

2026/11/9 0:37:55

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/9 0:03:09

建设厅的特种工有哪些含金量高?别交完钱考不过

建设厅的特种工有哪些含金量高?别交完钱考不过 怕考不过白交培训费?别急,先搞清楚建设厅的特种工有哪些含金量高的证,再决定是不是值得投入时间和金钱。 建设厅的特种工证是建筑行业里最基础、也最实用的证书之一,涉及多个作业类别,每种证的 含金量…

2026/11/9 0:03:09

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱 怕考不过白交培训费?荆门市电工证报名前必须知道这些避坑指南。别看网上一堆培训机构广告,真要报个电工证,很多人被坑得一塌糊涂。特别是那些打着“包过”旗号的,最后不是考试不过,就是证不是全国通…

2026/11/9 0:03:09

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑 不知道去哪报名怕被中介坑?你不是一个人。现在特种作业证报名渠道五花八门,从线下培训机构到线上代理,真假难辨。尤其是像高空电工作业这类高风险、高门槛的作业类型,证书含金量和考试通过率直接影响你…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑