使用tRPC的useMutation时后端接收空输入,useQuery正常求助
tRPC useMutation 后端接收空输入问题排查与解决
可能的原因及解决方案
1. Zod 输入校验规则过于宽松
你的后端代码中,input 定义嵌套了两层 .nullish():
.input(z.object({ name: z.string().nullish() }).nullish())
这意味着整个输入参数可以是 null/undefined,如果前端传入的对象与Zod规则不匹配(比如包含未声明的字段、类型不兼容),tRPC会自动将 input 置为 null。
解决方法:
如果 create 接口需要必填的输入对象,去掉外层的 .nullish():
.input(z.object({ name: z.string().nullish() })) // 仅允许name字段为null/undefined,整个输入对象必填
若确实需要允许输入为空,确保前端传入的参数严格符合规则(要么是符合结构的对象,要么是 null/undefined)。
2. 前端传参结构与后端定义不匹配
检查前端 T_Insert_DevCompany 类型是否与后端Zod定义的结构一致:
- 确认
latestDoc是包含name字段的对象(而非数组、字符串等其他类型) - 查看浏览器控制台的
console.log({latestDoc})输出,确保参数结构正确
3. 网络请求 payload 异常
打开浏览器开发者工具的「网络」面板,找到tRPC的mutation请求(通常是POST请求,路径包含 /trpc),查看请求的 payload:
- 若payload为空:说明前端
mutate(latestDoc)未正确传递参数,检查onSubmit触发逻辑、latestDoc的生成过程 - 若payload有数据:说明后端解析或校验环节出问题,重点排查Zod规则和tRPC中间件
4. tRPC 中间件干扰
检查 publicProcedure 是否包含自定义中间件,确认中间件没有修改或清空 input 参数。
快速验证步骤
临时修改后端mutation,简化输入校验:
.input(z.any()) // 临时允许任意输入 .mutation(({ input }) => { console.log({input}) return input; })
如果此时后端能收到输入,说明问题出在原Zod校验规则上;如果还是为空,再排查前端传参和网络请求。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

