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
相关产品推荐
相关产品推荐

