You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apollo Client查询返回null,但GraphQL Playground可返回数据的问题

问题原因及解决方案

你遇到的问题核心是**useLazyQuery是异步操作**——调用fetchPartner后,查询请求还在发送中,不会立刻更新partnerData,所以你在调用后同步打印和判断的都是旧的null值,而GraphQL Playground里是直接发送查询,自然能拿到最新数据。

下面是具体的解决办法:

  • 方法一:监听partnerData的更新
    把跳转逻辑放到监听partnerData的useEffect里,等数据真正返回后再处理:

    useEffect(() => {
      if (partnerData?.getPartner) {
        setPartner(partnerData.getPartner)
        router.replace('/success')
      }
    }, [partnerData, router])
    
  • 方法二:用fetchPartner的onCompleted回调
    调用查询时传入回调函数,在查询完成后直接处理返回的数据:

    const checkSuccess = () => {
      if (!addPartnerError) {
        fetchPartner({
          variables: { email: form.email },
          onCompleted: (data) => {
            if (data?.getPartner) {
              setPartner(data.getPartner)
              router.replace('/success')
            }
          }
        })
      }
    }
    
  • 方法三:确保mutation完成后再触发查询
    可以给useMutation加onCompleted回调,保证mutation成功完成后才发起查询:

    const [addPartner, { error: addPartnerError }] = useMutation(ADDPARTNER, {
      onCompleted: () => checkSuccess()
    })
    
    const handleSubmit = async () => {
      await addPartner({ variables: { input: { ...form } } })
    }
    
  • 方法四:排查缓存问题
    如果以上方法都没用,可能是Apollo Client的缓存导致读取了旧数据,你可以强制从服务器获取最新数据:

    fetchPartner({
      variables: { email: form.email },
      fetchPolicy: 'network-only' // 跳过缓存,直接请求服务器
    })
    

    或者在mutation时直接更新缓存,避免后续查询再请求服务器:

    const [addPartner] = useMutation(ADDPARTNER, {
      update: (cache, { data: { addPartner } }) => {
        cache.writeQuery({
          query: GETPARTNER,
          variables: { email: addPartner.email },
          data: { getPartner: addPartner }
        })
      }
    })
    

内容的提问来源于stack exchange,提问作者Kate Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:23:11