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

Uncaught ApolloError: Error message not found报错原因排查(附onError Link代码)

关于Uncaught ApolloError: Error message not found错误的原因分析

核心原因梳理

  • 错误对象缺少必要的message属性:Apollo Client在处理错误时,要求错误对象必须包含message字段。你的代码中直接将error或networkError传给LogRocket,如果这两个值本身没有有效的message属性(比如networkError是一个不规范的对象、graphQLErrors为空且无错误消息),Apollo后续处理时会抛出该错误。
  • 错误链路未正确终止:onError Link中如果没有明确终止错误传播,未处理的错误会继续向下传递。当传递的错误对象不符合Apollo的错误格式要求(缺少message),就会触发"Error message not found"异常。
  • 错误解构的潜在风险:代码中const { code } = error || {};搭配@ts-ignore跳过类型检查,可能导致对error结构的误判——比如error不存在code属性,或extensions字段缺失,间接导致错误处理逻辑失效,让不符合要求的错误流入后续流程。

代码层面的具体问题点

  1. 无兜底的错误消息处理:当graphQLErrors为空,且networkError不是标准Error对象(没有message字段)时,LogRocket.error(error || networkError)传递的错误对象缺少message字段,触发Apollo的格式校验错误。
  2. 未终止错误传播:在处理完认证错误或网络请求失败后,没有添加终止逻辑(如return;),错误会继续在链路中传递,Apollo尝试格式化错误时因找不到消息抛出异常。
  3. 类型忽略导致的结构异常:// @ts-ignore跳过了TypeScript的类型检查,可能让不符合预期结构的错误对象进入处理逻辑,比如error没有extensions属性,导致后续判断失效,错误未被正确处理。

修复建议

  • 兜底错误消息:在记录错误前,确保错误对象包含message字段:
const errorToLog = error || networkError;
if (!errorToLog?.message) {
  Object.assign(errorToLog, { message: 'Unknown error occurred' });
}
LogRocket.error(errorToLog);
  • 按需终止错误传播:在处理完目标错误后添加return;,阻止错误流入后续链路:
if (error?.extensions?.code === 'UNAUTHENTICATED' || code === 401 || code === 403) {
  logger.info('User logged out due to authentication error', error);
  logUserOut();
  return;
} else if (networkError?.message === 'Failed to fetch') {
  logUserOut();
  return;
}
  • 移除类型忽略并做安全校验:替换@ts-ignore,明确检查错误结构:
const code = error?.extensions?.code || (error as Record<string, any>)?.code;

内容的提问来源于stack exchange,提问作者Leon Kolodner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:45:08