Apollo-Client字段为Null引发网络错误,运行代码突发报错求助
听起来你遇到了个挺闹心的问题——之前稳定跑了好几个月的Apollo Client代码,没改配置也没动前端代码,今早突然抛出了网络错误,核心报错就是Cannot convert undefined or null to object。结合我处理这类问题的经验,这大概率不是Apollo Client本身的bug,而是后端响应结构悄悄变化或者缓存里存了异常数据导致的,下面给你一步步的排查和解决思路:
先查GraphQL响应的实际返回值
别着急改代码,先打开浏览器的Network面板或者Apollo DevTools,找到触发报错的那个GraphQL请求,仔细看它的response payload。重点盯你查询的字段里有没有null值,尤其是那些你前端代码里当成对象来操作的字段(比如解构属性、调用Object.keys()/Object.entries()这类方法)。
举个例子:如果查询返回user: null,但前端直接写了const { name } = user,就会触发这个报错——Apollo Client本身不会因为字段为null抛网络错误,实际是前端处理响应时的空值操作引发的异常,被Apollo的错误捕获机制包装成了"Network error"。清空Apollo缓存验证问题
有时候旧缓存里的异常数据会搞事情。你可以在Apollo DevTools的"Cache"面板里点"Reset Cache"按钮,然后重新发起请求,看报错会不会消失。如果解决了,说明是缓存里存了异常的null值,这时候可以给查询加个fetchPolicy临时绕过缓存,或者调整缓存写入逻辑:// 临时用网络请求绕过缓存 const { data } = useQuery(YOUR_QUERY, { fetchPolicy: 'network-only' });给前端代码加上空值防御
不管后端有没有偷偷改返回结构,前端都得做好空值兜底,别把null/undefined当成对象来操作。推荐用ES6的可选链(?.)和空值合并运算符(??):const { data } = useQuery(YOUR_QUERY); // 给可能为null的字段兜底为空对象 const targetData = data?.targetField ?? {}; // 访问嵌套属性时用可选链避免报错 const fieldValue = targetData?.nestedField;如果是在Apollo的缓存更新逻辑(比如
update函数、cache.modify)里出的错,要确保操作的字段有默认值:cache.modify({ id: cache.identify(parentObject), fields: { // 给existingList默认值为空数组,避免null时展开报错 existingList(existingList = []) { return [...existingList, newItem]; } } });排查依赖包是否自动更新
虽然你说没改代码,但如果package.json里Apollo相关包用了^这类版本前缀,可能依赖包自动更到了新版本,导致行为变化。可以看看package-lock.json或者yarn.lock里的@apollo/client、graphql等包的版本,对比之前稳定时的版本,回退到旧版本试试能不能解决问题。
内容的提问来源于stack exchange,提问作者Daniele Bernardini

