gpt4 book ai didi

error-handling - 如何防止 Apollo 客户端 useQuery 中的错误传播?

转载 作者:行者123 更新时间:2023-12-03 07:51:45 27 4
gpt4 key购买 nike

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

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 />
}
它工作正常,但同时,错误正在传播到它的父级,所以我收到另一个错误通知消息,它​​来自全局级别的错误处理程序。
在应用程序级别,我使用 apollo-link-error 来管理 Graphql 错误。
import { onError } from 'apollo-link-error';
const errorLink = onError (({ graphqlErrors, networkError }) => {
if(graphqlErrors)
notification.error(graphqlErrors[0].message);
});
const client = ApolloClient({
cache: new InMemoryCache(),
link: ApolloLink.from([
errorLink,
new HttpLink({ uri: `http://localhost:8080/graphql`})
])
})
目前,我正在寻找一种解决方案来停止传播到顶级,以便我只能显示 InvitationErrorPage并停止在全局级别显示错误通知。

最佳答案

我还试图通过在 useQuery 上处理错误来防止错误被记录到错误链接中。钩子(Hook)并进一步深入研究 ApolloLink 文档有助于弄清楚正在发生的事情。关键的误解是错误链接不是父级或应用程序级处理程序,它是请求中间件。考虑数据如何从服务器返回是有帮助的:
Data flow to client through ApolloLink path.
因此,当您看到来自错误链接的错误通知时,它并不是从 useQuery“传播”而来的。钩子(Hook):它发生在请求路径之前 useQuery结果在客户端可用。
因此,onError错误链接的回调总是在 useQuery 中的任何错误处理代码之前调用。钩。
可能您最好的选择是使用 operation 的组合。和 graphQLErrors[x].extensions找出应该通过 Error Link 中间件传递的错误,如下所示:

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);
})

关于error-handling - 如何防止 Apollo 客户端 useQuery 中的错误传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64788627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com