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

如何阻止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;

额外检查点

  1. 确认部署环境的NODE_ENV确实设置为production:部分部署平台(如Vercel、Netlify)会自动设置,但自行部署时需手动配置环境变量。
  2. 若使用Next.js,确保生产构建命令(next build)执行时环境变量正确生效。

通过上述配置,生产环境下的错误响应将不再包含stack属性,符合期望输出。

内容的提问来源于stack exchange,提问作者Letícia Amaral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:52:14