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

使用trpc express适配器如何解包响应?支持单独端点吗?

解包TRPC响应直接返回原始结果

当然可以实现响应解包,不管是全局生效还是仅针对特定端点,下面是两种场景的具体实现方式:

全局解包所有端点

在TRPC服务端初始化时,通过自定义responseFormat修改默认响应结构,直接返回原始数据:

import { initTRPC } from '@trpc/server';

const t = initTRPC.create({
  responseFormat: {
    // 成功响应直接返回原始数据(根据你的实际结构调整路径)
    success(data) {
      return data.original_response;
    },
    // 错误响应按需自定义格式
    error({ error }) {
      return {
        error: {
          message: error.message,
          code: error.code,
        },
      };
    },
  },
});

// 后续路由定义直接使用该t实例
export const appRouter = t.router({
  // 你的端点定义...
});

配置后所有端点的成功响应都会直接返回原始结果,无需再通过result.data层级获取。

仅针对特定端点解包

如果只想让部分端点实现解包,可通过自定义中间件处理:

import { initTRPC } from '@trpc/server';

const t = initTRPC.create();

// 创建解包专用中间件
const unwrapMiddleware = t.middleware(async ({ next }) => {
  const result = await next();
  // 仅处理成功响应,提取原始数据
  if (result.type === 'data') {
    return {
      ...result,
      data: result.data.original_response, // 替换为你实际的原始数据路径
    };
  }
  // 错误响应保持默认结构
  return result;
});

// 在目标端点上挂载该中间件
export const appRouter = t.router({
  // 需要解包的端点
  unwrappedEndpoint: t.procedure
    .use(unwrapMiddleware)
    .query(() => {
      return { original_response: ['你的原始数据内容'] };
    }),
  // 普通端点保持默认包裹格式
  normalEndpoint: t.procedure.query(() => {
    return { data: '默认结构的数据' };
  }),
});

另外也可以在客户端做一层封装,比如自定义Hook自动解包特定端点的响应:

// 客户端自定义Hook
const useUnwrappedQuery = (endpointName: string, args?: any) => {
  const query = trpc[endpointName].useQuery(args);
  return {
    ...query,
    // 自动提取原始数据
    data: query.data?.result.data.original_response,
  };
};

// 使用示例
const { data } = useUnwrappedQuery('unwrappedEndpoint');
// data直接为原始响应内容

注意:修改默认响应格式后,要确保客户端的错误处理逻辑适配新结构,避免出现未处理的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:06:22