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

Next.js App Router中调用自定义TRPCRouter报错求助

解决Next.js App Router中TRPC调用Stripe路由的报错问题

问题原因

App Router默认组件为服务器组件,而~/trpc/react导出的是客户端TRPC实例,服务器组件不允许直接访问客户端模块的属性(如api.stripe.somefunction),只能完整传递导入的模块。


解决方案分两种场景处理:

1. 在服务器组件中调用TRPC方法

需要使用服务器端TRPC调用器,而非客户端实例:

  • 先创建服务器端TRPC调用文件(如~/trpc/server.ts):
import { appRouter } from './routers';
import { createTRPCContext } from './context';
import { createCallerFactory } from '@trpc/server';

// 创建调用器工厂
const createCaller = createCallerFactory(appRouter);

// 传入上下文创建服务器端调用实例
export const api = createCaller(createTRPCContext({
  // 这里根据你的上下文需求传入参数,比如session、db连接等
}));
  • 在服务器组件中导入并调用:
import { api } from '~/trpc/server';

async function ServerComponent() {
  // 直接异步调用方法(无需hooks)
  const result = await api.stripe.somefunction.query();
  
  return <div>{JSON.stringify(result)}</div>;
}

export default ServerComponent;

2. 在客户端组件中调用TRPC方法

只需给组件添加'use client'指令,标记为客户端组件后即可正常使用客户端TRPC实例:

'use client';

import { api } from '~/trpc/react';

function ClientComponent() {
  // 使用TRPC的React hooks调用方法
  const { data, isLoading } = api.stripe.somefunction.useQuery();
  
  if (isLoading) return <div>加载中...</div>;
  
  return <div>{JSON.stringify(data)}</div>;
}

export default ClientComponent;

为什么Pages路由没有这个问题?

Pages路由中,页面组件默认是客户端组件(除非使用getServerSideProps等服务器端渲染方法),因此可以直接访问客户端TRPC实例的属性。而App Router默认使用服务器组件,带来了更严格的模块访问限制。

内容的提问来源于stack exchange,提问作者huud-e

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:17:40