使用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
相关产品推荐
相关产品推荐

