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

如何打印完整URQL缓存 排查按userId定制API缓存配置问题

URQL 打印全量缓存数据的实现方法

所有操作都需要先拿到项目中初始化完成的URQL Client实例:React环境可通过useUrqlClient()钩子获取,Vue环境可通过useClient()获取,非框架场景直接引用初始化时导出的client对象即可。


场景1:使用URQL默认自带的 Document Cache

默认缓存没有提供直接读取全量数据的内置API,可以通过自定义存储层的方式拿到全量缓存内容:

import { Client, cacheExchange, fetchExchange } from '@urql/core';

// 自定义缓存存储容器
const cacheStore = new Map();
const customCacheExchange = cacheExchange({
  storage: {
    read: (key) => cacheStore.get(key),
    write: (key, value) => cacheStore.set(key, value),
    clear: () => cacheStore.clear()
  }
});

const client = new Client({
  url: '/api/graphql',
  exchanges: [customCacheExchange, fetchExchange]
});

// 需要打印缓存时直接执行
console.log('URQL全量缓存:', Object.fromEntries(cacheStore.entries()));

如果只需要看缓存的读写操作日志,直接给cacheExchange传入debug: true配置即可,控制台会自动输出所有缓存命中、写入、失效的操作记录。


场景2:使用@urql/exchange-graphcache(归一化缓存,定制userId维度缓存规则的常用方案)

做按用户维度隔离缓存的场景基本都会用Graphcache,它本身内置了直接导出全量缓存的方法,不需要额外改造:

// 拿到client实例后,直接调用缓存实例的dump方法
const allCacheData = client.cache.dump();
console.log('URQL Graphcache全量归一化缓存:', allCacheData);

dump()方法返回的是普通JS对象,key为归一化后的实体标识(格式类似User:xxx、Query:xxx),value为对应实体存储的所有字段值,你可以直接检索对应userId关联的缓存条目,验证自定义缓存规则是否正确生效。
如果需要实时观测缓存变化,可以在graphcache的updates、resolvers回调里调用cache.dump()打印,也可以在切换用户账号、触发接口请求后手动执行打印逻辑。


缓存规则排查提示

做userId维度缓存定制时,可以对照打印出来的缓存内容检查两点:

  • 不同userId对应的实体key是否做了区分,避免不同用户的缓存共用同一个key导致串数据
  • 用户登出/切换账号时,是否正确调用了client.cache.invalidate()清理旧用户的缓存条目

内容的提问来源于stack exchange,提问作者mark fuechec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:01:43