如何阻止tRPC响应中返回stack属性?
问题描述
我正在用基于tRPC的T3 Framework构建POC,无法阻止HTTP响应中返回stack属性。已经将NODE_ENV设置为"production",但前端仍能接收到栈追踪信息。
注:模板存在时无需额外错误处理,问题恰好出现在模板仓库未返回有效模板时。
注2:简化代码以复现问题:
export const templatesRouter = createTRPCRouter({ get: publicProcedure .input(z.object({id: z.string().min(3)})) .query(async ({input}) => { const template = await TemplateRepository.get(input.id); if(!template) throw new TRPCError({ code: 'NOT_FOUND', message: 'Template not found', }) return template }), });
实际响应:
{ "error": { "json": { "message": "Template not found", "code": -32004, "data": { "code": "NOT_FOUND", "httpStatus": 404, "stack": "TRPCError: Template not found\n at eval (webpack-internal:///(rsc)/./src/server/api/routers/templates.ts:46:30)...", "path": "templates.get", "zodError": null } } } }
期望响应:
{ "error": { "json": { "message": "Template not found", "code": -32004, "data": { "code": "NOT_FOUND", "httpStatus": 404, "path": "templates.get", "zodError": null } } } }
解决方法
在T3项目的tRPC服务配置文件(通常是src/server/api/trpc.ts)中,通过自定义errorFormatter来控制是否返回stack属性:
import { initTRPC } from "@trpc/server"; import { type CreateNextContextOptions } from "@trpc/server/adapters/next"; // 保留你原本的createContext逻辑 const createContext = async (opts: CreateNextContextOptions) => { // ...你的上下文代码 }; const t = initTRPC.context<typeof createContext>().create({ errorFormatter({ shape, error }) { return { ...shape, data: { ...shape.data, // 仅在开发环境返回栈追踪,生产环境移除 stack: process.env.NODE_ENV === "development" ? error.stack : undefined, }, }; }, }); // 导出你的router、procedure等 export const router = t.router; export const publicProcedure = t.procedure;
额外检查点
- 确认部署环境的
NODE_ENV确实设置为production:部分部署平台(如Vercel、Netlify)会自动设置,但自行部署时需手动配置环境变量。 - 若使用Next.js,确保生产构建命令(
next build)执行时环境变量正确生效。
通过上述配置,生产环境下的错误响应将不再包含stack属性,符合期望输出。
内容的提问来源于stack exchange,提问作者Letícia Amaral
相关产品推荐
相关产品推荐

