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

ApolloClient useQuery的onError回调无法返回错误求助

解决GraphQL请求返回200但无法捕获错误的问题

问题根源在于errorPolicy: 'none'的配置不符合你的需求,加上你未解构useQuery返回的错误对象,导致无法触发onError回调或获取错误信息。以下是两种可行的解决方法:

方法1:调整errorPolicy并通过onError捕获错误

将errorPolicy改为'all',Apollo Client会保留响应中的errors数组并触发onError回调,你可以从回调参数的graphQLErrors属性中提取服务端返回的错误信息:

const { data: res } = useQuery(
    GQL_QUERY,
    {
      variables: {
        someData,
      },
      errorPolicy: 'all', // 修改此处配置
      onError: (error) => {
        console.log('err', error);
        // 获取服务端返回的错误消息
        const serverErrMsg = error.graphQLErrors[0]?.message;
        if (serverErrMsg) {
          // 根据错误消息执行本地函数
          yourLocalFunction(serverErrMsg);
        }
      },
    }
);

方法2:直接解构error对象处理错误

如果不想依赖onError回调,可以直接解构useQuery返回的error对象,在组件逻辑中监听错误变化并处理:

const { data: res, error } = useQuery(
    GQL_QUERY,
    {
      variables: {
        someData,
      },
      errorPolicy: 'all', // 需设置为all以保留错误信息
    }
);

// 监听error变化,触发本地函数
useEffect(() => {
  if (error) {
    const serverErrMsg = error.graphQLErrors[0]?.message;
    if (serverErrMsg) {
      yourLocalFunction(serverErrMsg);
    }
  }
}, [error]);

为什么原代码的onError未触发?

当设置errorPolicy: 'none'时,若响应仅包含errors(无有效data),Apollo Client会将GraphQL错误视为运行时异常抛出,但不会进入onError回调;改为'all'后,所有GraphQL层面的错误都会被正常捕获,错误信息会被封装在error.graphQLErrors中供你处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:24:43