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

