SuperAPI AI 工具集

non-json-content-types

编程与开发

查看项目

更新于 10-16 01:50

技能介绍

用途:该技能说明如何在 tRPC 的 mutation 中处理非 JSON 内容类型,如 FormData、文件上传、Blob、Uint8Array 和 ReadableStream 输入。适用于需要向 tRPC 后端提交表单或二进制文件的场景。

主要能力:服务端可使用 z.instanceof(FormData) 接收并读取 FormData;使用从 @trpc/server/http 导入的 octetInputParser 处理二进制数据,它会把 Blob、Uint8Array 和 File 输入转换为服务端的 ReadableStream。客户端可使用 isNonJsonSerializable 与 splitLink 将非 JSON 请求路由到 httpLink,其余请求走 httpBatchLink。

使用方式:服务端定义 publicProcedure.input(z.instanceof(FormData)).mutation 或 .input(octetInputParser).mutation;客户端用 createTRPCClient 配合 splitLink,condition 使用 isNonJsonSerializable(op.input),true 分支为 httpLink,false 分支为 httpBatchLink。使用 transformer 时,非 JSON 的 httpLink 需自定义 transformer 跳过请求序列化并反序列化响应,例如 serialize: (data) => data 搭配 superjson.deserialize。

限制与常见错误:FormData 和二进制输入不可批处理,不能使用 httpBatchLink,应通过 splitLink 走 httpLink。全局 express.json() 中间件会在 tRPC 读取前消费请求体,须将 body parsing 限定在非 tRPC 路由。FormData 与二进制输入仅支持 mutation(POST 请求),用于 .query() 会报错,因为查询使用 HTTP GET 无法携带请求体。以上内容依据所提供资料整理,其他细节暂未提供。