如何添加全局错误处理器将自定义错误转换为TRPCError?
解决方案
你可以通过全局Middleware实现自定义错误的全局转换,这样TRPC会自动根据转换后的TRPCError code生成对应HTTP状态码(比如NOT_FOUND对应404),无需手动修改响应结构。
步骤1:创建全局错误处理Middleware
这个Middleware会包裹所有Procedure的执行逻辑,捕获自定义错误并转换为TRPCError:
// 全局错误处理中间件 const errorHandlingMiddleware = middleware(async ({ next }) => { try { return await next(); } catch (error) { if (error instanceof Error) { // 调用你的错误处理函数转换错误 throw standardTrpcErrorHandler(error); } // 兜底处理非Error类型的异常 throw new TRPCError({ code: 'INTERNAL_SERVER_ERROR', message: '未知错误', }); } });
步骤2:将Middleware绑定到全局Procedure
修改你的publicProcedure,让所有路由默认使用这个错误处理中间件:
// 替换原来的publicProcedure定义,加入全局错误处理 const publicProcedure = t.procedure.use(errorHandlingMiddleware);
步骤3:修正错误处理函数的语法问题
注意你的standardTrpcErrorHandler里有个拼写错误,errorinstanceof需要改成error instanceof:
export const standardTrpcErrorHandler = (error: Error): TRPCError => { // 修复 instanceof 的拼写 if (error instanceof MyCustomError) { return new TRPCError({ ...error, code: 'NOT_FOUND', message: error.message, }); } return new TRPCError({ ...error, code: 'INTERNAL_SERVER_ERROR', message: error.message, }); };
这样,当MyCustomService抛出MyCustomError时,Middleware会自动捕获并转换为对应code的TRPCError,TRPC会自动处理HTTP状态码和响应格式,无需在errorFormatter中手动修改。
内容的提问来源于stack exchange,提问作者justindao
相关产品推荐
相关产品推荐

