NestJS用GraphQLFederationModule时如何通过formatError区分异常类型
NestJS GraphQL Federation formatError 下四类异常识别方案
所有判断逻辑基于formatError入参GraphQLError对象的extensions.originalError字段展开——这个字段会保留异常抛出时的原始错误对象,不需要通过错误文本匹配做判断,准确率更高。
通用取值逻辑:
formatError: (error: GraphQLError) => { // 取原始错误对象 const originalErr = error.extensions?.originalError as any; // 后续分类判断均基于originalErr的结构特征 }
1. Resolver/Service 内部逻辑错误判断
- 这类错误为应用代码主动抛出的业务类异常,是四类里的兜底分类
- 判断特征:
- 命中Nest原生异常体系特征,即
originalErr instanceof HttpException,且不满足下文三类第三方错误的结构标记 - 通常自带Nest标准异常属性:
statusCode、response,不存在mongoose、graphql-request、axios类错误的专属结构 - 注意:如果在业务代码中包装第三方错误时丢失了原错误标记,这类包装后的异常会被误归为内部逻辑错误,需要在包装时预留标记位做识别
- 命中Nest原生异常体系特征,即
2. Mongoose MongoDB操作错误判断
- 这类错误为Mongoose/MongoDB驱动原生抛出的错误,无需手动包装即可透传到formatError
- 判断特征:
- 错误名命中Mongoose生态的固定错误类型:
originalErr.name为ValidationError、CastError、VersionError、MongoServerError、MongooseError - 可通过专属属性精准校验:比如校验类错误自带
errors字段存储字段校验规则、MongoDB服务端错误自带code字段(如11000为唯一索引冲突) - 适配场景:如果在service层catch了Mongoose错误后重新抛出自定义异常,可在自定义异常上挂载
isFromMongoose: true标记,直接识别归类
- 错误名命中Mongoose生态的固定错误类型:
3. 下游GraphQL服务(graphql-request调用)错误判断
- 这类错误为graphql-request库原生抛出的下游请求错误,联邦场景下的跨服务解析错误也属于这类
- 判断特征:
- 错误名匹配graphql-request的原生错误类型:
originalErr.name为ClientError、GraphQLClientError - 可通过专属结构精准校验:错误对象自带
response字段存储下游返回内容,结构为标准GraphQL响应格式(包含errors数组、data字段) - 联邦适配:如果是联邦层的跨服务实体解析失败,
error.extensions.code会固定为DOWNSTREAM_SERVICE_ERROR,也可直接归类到这类
- 错误名匹配graphql-request的原生错误类型:
4. 下游REST服务(axios调用)错误判断
- 这类错误为axios库原生抛出的请求错误,特征明确判断准确率最高
- 判断特征:
- 错误名固定为
AxiosError - 专属属性校验:错误对象自带
isAxiosError: true的固定布尔标记,同时存在config、request、response这三个axios错误独有的字段 - 适配场景:如果在axios拦截器中包装了错误为Nest异常,需要保留
isAxiosError: true标记,避免被误归为内部逻辑错误
- 错误名固定为
分类逻辑优化提示
- 禁止通过错误文本内容做分类判断:生产环境通常会对错误文本做脱敏处理,很容易出现匹配失效
- 所有第三方错误的包装链路需要保留原错误的特征标记,避免无标记透传导致分类失效
- 分类逻辑最后加兜底分支:不匹配前三类特征的错误,默认归为内部逻辑错误
内容的提问来源于stack exchange,提问作者Victor Cheng
相关产品推荐
相关产品推荐

