You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TRPC查询返回500错误,Next.js自定义Hook配置问题求助

解决TRPC + Next.js中generateRandomWorker接口返回500错误的问题

先定位具体错误原因

500是通用服务端错误,首先要拿到服务端的具体错误日志,这是排查核心:

  • 查看Next.js终端输出,TRPC在开发环境会打印详细错误信息
  • 若终端无显示,修改TRPC的API路由(src/pages/api/trpc/[trpc].ts)添加错误捕获:
import { createNextApiHandler } from '@trpc/server/adapters/next';
import { appRouter } from '@/server/routers';
import { createContext } from '@/server/trpc';

const handler = createNextApiHandler({
  router: appRouter,
  createContext,
  onError({ error }) {
    console.error('TRPC服务端错误:', error);
  },
});

export default handler;

重新发起请求,即可在终端看到具体错误细节。

针对已知信息的排查修复步骤

1. 处理同步方法的错误捕获

你的WorkerService.generateRandomWorker是同步方法,若它抛出异常,TRPC的query会直接返回500且不暴露具体错误。修改服务端路由,添加错误捕获并确保返回Promise:

// src/server/routers/WorkerAPI.ts
generateRandomWorker: procedure
  .input(z.null())
  .output(PrismaWorkerCreateInputSchema)
  .query(async () => {
    try {
      return WorkerService.generateRandomWorker();
    } catch (err) {
      console.error('生成随机Worker失败:', err);
      throw new Error('生成随机Worker失败'); // 调试阶段可直接抛出原错误
    }
  }),

TRPC支持同步返回query结果,但同步代码抛出的错误会被封装成500,用async包裹并添加try/catch能明确看到错误根源。

2. 确认客户端与服务端的输入匹配

服务端已明确设置.input(z.null()),客户端调用client.generateRandomWorker.query(null)是正确的。需确保CreateWorker类型与PrismaWorkerCreateInputSchema完全兼容,避免序列化错误(你使用了SuperJSON,大概率无问题,可手动验证类型一致性)。

3. 验证TRPC API路由完整性

确保src/pages/api/trpc/[trpc].ts正确关联了合并后的appRouter(包含WorkerRouter),且createContext无初始化问题——你提到getServerSideProps中直接调用WorkerService正常,这一步大概率无问题,但需确认总路由合并逻辑正确。

额外验证步骤

  • 直接在浏览器访问http://localhost:3000/api/trpc/generateRandomWorker,查看返回的错误详情(开发环境下TRPC会返回具体错误)
  • 暂时注释Hook中createWorker的调用,单独测试generateRandomWorker接口,确认是该接口本身问题还是后续调用的连锁错误

内容的提问来源于stack exchange,提问作者Ken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:15:34