【问题标题】:How to Fix Bug in Apollo-link for GraphQL Error如何修复 Apollo-link 中针对 GraphQL 错误的错误
【发布时间】:2020-10-25 12:03:48
【问题描述】:

在这里,我可以同时使用 graphQLErrors 和 networkError:

  const errorLink = onError(({ operation, graphQLErrors, networkError, forward }) => {
    if (process.env.NODE_ENV !== 'production') {
      if (networkError) {
        console.log(`[Network Error]:`, networkError.message);
      }
      if (graphQLErrors) {
        graphQLErrors.forEach((error) => {
          console.log(`[GraphQL Error]:`, error.message);
        });
      }
    }
  });

但是当尝试在 useQuery 中获取这些错误时,在组件级别,仅返回 networkError,而 graphQLErrors 是一个空数组:

let { loading, error, data } = useQuery(GET_ALL_PROJECTS, {
 variables: { pageNum: 1, pageSize: 10 },
 fetchPolicy: 'network-only',
 });

例如,我从后端收到一个错误 403 到 onError 函数,但无法在 useQuery 中处理此错误!

如何解决这个问题??

【问题讨论】:

  • 不清楚你在这里问什么。要么有networkError,要么请求成功但有graphQLErrors。一个请求永远不会同时返回。
  • 正确,我在个人资料页面中记录了两个错误,但 graphQLErrors 为空并且 networkError 抛出而不是 graphQLError。
  • 这是预期的行为。见here。你的问题到底是什么?
  • 此问题已在 GitHub 问题上公开。请参阅github.com/apollographql/apollo-link/issues/1285

标签: error-handling apollo apollo-client apollo-link


【解决方案1】:

Apollo 客户端通过 graphQLErrorsnetworkError 转发,这是真的。我相信这是假设当网络错误发生时,返回数据中的 GraphQL 错误更具技术性,不应该向用户显示。如果您真的想访问服务器发送的附加错误信息,您可以在networkError.result.errors 中实际访问它。

我在打字稿中的代码提取错误:

const { networkError } = error
const networkGraphQLErrorsPresent =
  networkError &&
  "result" in networkError &&
  networkError.result.errors &&
  networkError.result.errors.length > 0
const extractedError =
  networkGraphQLErrorsPresent ?
    (networkError.result.errors[0] as GraphQLError) :
    undefined

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 2017-06-23
    • 2018-12-27
    • 2020-03-01
    • 2022-01-25
    • 2019-06-12
    • 2018-08-21
    • 2020-01-22
    • 2019-09-29
    相关资源
    最近更新 更多