无法捕获GraphQL错误仍显示未处理运行时错误,求处理方案
处理GraphQL Mutation的未捕获错误并展示提示
要解决你遇到的“已解构error但仍出现未捕获错误”问题,核心是阻止Apollo Client将GraphQL错误抛到全局,同时手动捕获错误来展示模态框或提示消息,以下是具体方案:
方案1:调用Mutation时用try/catch手动捕获
useMutation返回的mutate函数是Promise,通过try/catch包裹调用,可以直接捕获错误,避免全局未捕获报错:
const [submitVoting, { loading }] = useMutation(mutationQuery); const handleVoteSubmit = async () => { if (loading) return; try { await submitVoting({ variables: { /* 你的投票变量 */ } }); // 投票成功后的逻辑(比如刷新数据、关闭弹窗) } catch (err) { // 这里处理错误,比如打开提示模态框或显示消息 console.log('投票错误:', err.message); // 示例:调用模态框显示逻辑 // setShowErrorModal(true); // setErrorMsg(err.message); } };
方案2:配置useMutation的errorPolicy
通过设置errorPolicy为'all',让Apollo Client不再将GraphQL错误抛到全局,而是将错误存入返回的error对象中,之后可以监听error变化来展示提示:
const [submitVoting, { loading, error}] = useMutation(mutationQuery, { errorPolicy: 'all' // 关键配置,可选值:'none'(默认)/'ignore'/'all' }); // 监听error变化,展示提示 useEffect(() => { if (error) { // 打开模态框或显示提示消息 // 示例: // message.error(`操作失败:${error.message}`); // setErrorModalVisible(true); } }, [error]);
errorPolicy参数说明:
'none'(默认):Apollo会将GraphQL错误抛到全局,同时mutation的error为undefined'ignore':不抛全局错误,但mutation的error也为undefined,错误仅存于响应的errors字段中'all':不抛全局错误,mutation的error会包含完整的GraphQL错误信息
方案3:全局统一处理错误(可选)
如果需要项目内所有GraphQL请求的错误都统一处理,可以在创建Apollo Client时添加errorLink:
import { ApolloClient, InMemoryCache, HttpLink, from } from '@apollo/client'; import { onError } from '@apollo/client/link/error'; const errorLink = onError(({ graphQLErrors, networkError }) => { if (graphQLErrors) { graphQLErrors.forEach(err => { // 全局展示错误提示,比如用UI库的消息组件 // message.error(`请求错误:${err.message}`); console.log(`GraphQL Error: ${err.message}`); }); } if (networkError) { // 处理网络错误 // message.error('网络连接失败,请稍后重试'); console.log(`Network Error: ${networkError}`); } }); const client = new ApolloClient({ link: from([errorLink, new HttpLink({ uri: '/your-graphql-endpoint' })]), cache: new InMemoryCache(), });
内容的提问来源于stack exchange,提问作者Li 1001
相关产品推荐
相关产品推荐

