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后续处理时会抛出该错误。 - 错误链路未正确终止:
onErrorLink中如果没有明确终止错误传播,未处理的错误会继续向下传递。当传递的错误对象不符合Apollo的错误格式要求(缺少message),就会触发"Error message not found"异常。 - 错误解构的潜在风险:代码中
const { code } = error || {};搭配@ts-ignore跳过类型检查,可能导致对error结构的误判——比如error不存在code属性,或extensions字段缺失,间接导致错误处理逻辑失效,让不符合要求的错误流入后续流程。
代码层面的具体问题点
- 无兜底的错误消息处理:当
graphQLErrors为空,且networkError不是标准Error对象(没有message字段)时,LogRocket.error(error || networkError)传递的错误对象缺少message字段,触发Apollo的格式校验错误。 - 未终止错误传播:在处理完认证错误或网络请求失败后,没有添加终止逻辑(如
return;),错误会继续在链路中传递,Apollo尝试格式化错误时因找不到消息抛出异常。 - 类型忽略导致的结构异常:
// @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
相关产品推荐
相关产品推荐

