TRPC接口JSON响应截断问题排查求助
问题解决:TRPC接口返回JSON截断导致解析错误
核心问题定位
部署到render.com后,API服务返回的JSON内容被截断,导致客户端解析时出现Unexpected end of JSON input或Unterminated string in JSON at position错误。本地运行正常,直接调用API也存在问题,说明问题出在服务端或部署环境,与客户端配置无关。
解决步骤
1. 处理Prisma返回的非JSON兼容类型
Prisma默认返回BigInt类型(如id字段),JSON标准不支持该类型,本地开发环境可能有自动兼容处理,但部署环境(render.com的Node.js环境)没有。用superjson统一处理序列化:
首先安装依赖:
npm install superjson
然后修改TRPC的初始化配置:
// 你的TRPC router定义文件 import { initTRPC } from '@trpc/server'; import superjson from 'superjson'; const t = initTRPC.context<typeof createTRPCContext>().create({ transformer: superjson, // 自动处理BigInt、Date等非JSON类型 });
同步更新API路由的配置:
// apps/api/pages/api/trpc/[trpc].ts export default createNextApiHandler({ router: appRouter, createContext: createTRPCContext, transformer: superjson, // 确保API层也使用相同的序列化规则 });
2. 检查render.com资源限制
render.com的基础/免费实例内存有限,当返回大体积数据时,系统可能截断响应:
- 进入render.com控制台,查看实例的内存使用日志,确认是否存在内存溢出或资源耗尽的情况
- 若内存不足,升级实例规格;或优化数据库查询,减少返回的数据量(比如分页查询、明确指定
select字段过滤不必要内容)
3. 修复TRPC响应传输问题
Next.js Pages Router的TRPC适配器在部分部署环境下可能存在分块传输异常,手动包装处理:
// apps/api/pages/api/trpc/[trpc].ts import type { NextApiRequest, NextApiResponse } from 'next'; import { createNextApiHandler } from '@trpc/server/adapters/next'; const trpcHandler = createNextApiHandler({ router: appRouter, createContext: createTRPCContext, transformer: superjson, }); export default async (req: NextApiRequest, res: NextApiResponse) => { // 强制开启分块传输,避免响应被截断 res.setHeader('Transfer-Encoding', 'chunked'); await trpcHandler(req, res); };
4. 排查数据库查询的循环引用
如果查询返回了嵌套关联字段,可能出现循环引用导致JSON序列化失败:
// 错误示例:返回了嵌套的creatorAccount,可能引发循环引用 const items = await prisma.item.findMany({ include: { history: { include: { creatorAccount: true, // 若creatorAccount又关联了item,会形成循环 }, }, }, }); // 修复:明确指定select字段,避免循环引用 const items = await prisma.item.findMany({ select: { id: true, label: true, status: true, history: { select: { creatorId: true, createdAt: true, // 只返回必要字段,不要嵌套可能引发循环的关联 }, }, }, });
5. 验证render.com构建完整性
确保Turborepo在部署时正确构建,没有缓存旧代码:
- 修改render.com的构建命令为:
turbo clean && turbo build,强制清除缓存后重新构建 - 确认环境变量
NEXT_PUBLIC_API指向正确的API服务地址
内容的提问来源于stack exchange,提问作者repomn
相关产品推荐
相关产品推荐

