Error handling 如何在react中防止Apollo客户端useQuery中的错误传播?

Error handling 如何在react中防止Apollo客户端useQuery中的错误传播?,error-handling,graphql,apollo,react-apollo,apollo-client,Error Handling,Graphql,Apollo,React Apollo,Apollo Client,我想在组件级别捕获错误,并在@apollo/react hook中使用useQuery时防止传播。 下面是我的示例代码 const invitationDocument = gql` query DecodeInvitation($token: String!) { DecodeInvitation(token: $token) { name email } } ` const InvitationPage = (p

我想在组件级别捕获错误,并在@apollo/react hook中使用
useQuery
时防止传播。 下面是我的示例代码

const invitationDocument = gql`
   query DecodeInvitation($token: String!) {
       DecodeInvitation(token: $token) {
          name
          email
       }
   }
`
const InvitationPage = (props) => {
    const { data, error, loading } = useQuery(invitationDocument, {variables: { token: "XXXX" }});

    if(error)
    {
        return <InvitationErrorPage error={error.message}/>
    }

    return loading? <LoadingPage> : <InvitationAcceptPage />
}

现在,,我正在寻找一种停止向顶层传播的解决方案,这样我就可以只显示
InvitationErrorPage
,并停止在全局级别显示错误通知。

我还试图通过在
useQuery
钩子上处理错误来防止错误记录在错误链接中,并进一步深入研究错误链接文档有助于澄清正在发生的事情。关键的误解是错误链接不是父级或应用程序级处理程序,而是请求中间件。考虑数据是如何从服务器返回的是很有帮助的:

因此,当您从错误链接看到错误通知时,它不是从
useQuery
hook“传播”的:它发生在客户机上可用的
useQuery
结果之前的请求路径

因此,错误链接的
onError
回调总是在
useQuery
钩子中的任何错误处理代码之前调用

可能您的最佳选择是结合使用
操作
图形QLRERRORS[x]。扩展
来确定应该通过错误链接中间件传递哪些错误,如下所示:

const errorLink = onError(({operation, response, graphQLErrors}) => {
  if (!graphQLErrors) {
    return;
  }
  if (operation.operationName === "DecodeInvitation") {
    for (const err of graphQLErrors) {
      if (err.extensions?.code === 'UNAUTHENTICATED') {
        // Return without "notifying"
        return;
      }
    }
  }
  // Notify otherwise
  notification.error(graphqlErrors[0].message);
})

什么。。。错误链接只是从任何graphql响应捕获错误,它是响应处理的一部分。。。这里没有任何形式的传播。。如果您不想删除错误链接或仅对网络错误作出反应,请删除错误链接EAH,对于一般图形错误处理,我希望通过错误链接执行操作,包括显示通知消息。但在一个特定的情况下,即在我的情况下,邀请页面,我需要显示“ErrorPage”,而不是显示一般的错误通知。按响应内容过滤[type]?但我实际上无法处理apollo服务器,并且邀请查询错误与一般错误相比没有特殊的内容类型。因此,按响应内容[类型]过滤似乎不是一个好的解决方案。。。。你对我对阿波罗错误链接的理解产生了巨大的影响。这正是我以前想要的解决方案。谢谢你的回答。
const errorLink = onError(({operation, response, graphQLErrors}) => {
  if (!graphQLErrors) {
    return;
  }
  if (operation.operationName === "DecodeInvitation") {
    for (const err of graphQLErrors) {
      if (err.extensions?.code === 'UNAUTHENTICATED') {
        // Return without "notifying"
        return;
      }
    }
  }
  // Notify otherwise
  notification.error(graphqlErrors[0].message);
})