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

如何捕获并获取@apollo/client发起GraphQL查询时返回的错误信息

解决方案

原因说明

你设置的errorPolicy: "all"仅作用于GraphQL业务层面的错误(即接口返回200状态码,但响应体带errors字段的场景),400属于HTTP协议层面的错误,Apollo默认会直接抛出到catch块,不会走errorPolicy的逻辑。你捕获到的是Apollo封装的ApolloError实例,详细错误信息就藏在该实例的属性里。

方案1:直接从捕获的错误中提取信息

修改catch块的打印逻辑,即可直接拿到完整错误内容:

try {
    const response = await GraphQLClient.query({
        query: GET_PERSON,
        variables: {
            personId: id,
        },
        errorPolicy: "all",
    });
    console.log("response", response);
} catch (err) {
    // 完整ApolloError对象
    console.log("完整错误对象", err);
    // GraphQL业务错误列表
    console.log("GraphQL错误", err.graphQLErrors);
    // 网络/HTTP错误详情
    console.log("网络错误", err.networkError);
    // 服务器返回的错误JSON就在networkError的result属性中
    if (err.networkError?.result) {
        console.log("服务端返回的完整错误内容", err.networkError.result);
    }
}

方案2:调整Apollo Client初始化配置,全局统一处理错误

你当前的Client初始化配置缺少错误处理链路,可以新增全局错误拦截逻辑,所有请求的错误都会先经过该拦截器:

import { ApolloClient, InMemoryCache, createHttpLink, from } from "@apollo/client";
import { onError } from "@apollo/client/link/error";
import { Config } from "./../config";

const FRONTEND_API = `${Config.frontend_api}/graphql` || "";

// 全局错误拦截链路
const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors) {
    graphQLErrors.forEach(({ message, locations, path }) => {
      console.log(`GraphQL错误:${message},请求路径:${path},位置:${locations}`);
    });
  }
  if (networkError) {
    console.log(`网络错误:${networkError}`);
    if (networkError.result) {
      console.log("服务端错误详情", networkError.result);
    }
  }
});

const httpLink = createHttpLink({
  uri: FRONTEND_API,
});

export const GraphQLClient = new ApolloClient({
  // 把错误链路和HTTP链路组合起来
  link: from([errorLink, httpLink]),
  cache: new InMemoryCache(),
  // 全局配置默认错误策略,无需每次请求单独声明
  defaultOptions: {
    query: {
      errorPolicy: "all",
    },
  },
});

可选配置:让HTTP错误不进入catch块

如果你希望4xx/5xx类的HTTP错误也和GraphQL错误一样,存入response的errors字段,不抛出到catch块,可以自定义fetch逻辑覆盖默认行为:

const customFetch = (uri, options) => {
  return fetch(uri, options).then(response => {
    // 所有状态码的响应都正常返回,不抛出错误
    return response;
  });
};

const httpLink = createHttpLink({
  uri: FRONTEND_API,
  fetch: customFetch,
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:57:00