(GraphQL) - 为啥 Apollo 先检查缓存,然后再做其他事情?
Posted
技术标签:
【中文标题】(GraphQL) - 为啥 Apollo 先检查缓存,然后再做其他事情?【英文标题】:(GraphQL) - Why does Apollo check the cache first, before doing anything else?(GraphQL) - 为什么 Apollo 先检查缓存,然后再做其他事情? 【发布时间】:2020-01-15 15:20:40 【问题描述】:我们正在使用 Apollo GraphQL 开发 API。我们使用 Apollo 提供的开箱即用缓存解决方案(KeyValueCache
使用 Redis 数据存储)。
当请求查询到达时,为什么 ApolloServer 会先检查缓存再做其他事情?
有没有办法在缓存被触及之前插入逻辑?例如,我们想在 Apollo 检查缓存之前进行一些身份验证和权限检查。
(是的,有指令,但我们发现 Public/Private
范围和 maxAge
不足以满足我们的需求。)
【问题讨论】:
【参考方案1】:下面的代码和解释标记了几种不同的方法供您探索——希望其中一种能满足您的需求(我假设您知道您可以通过 fetchPolicy
控制 Apollo 是否首先查找缓存——尽管我对此进行了简要讨论以下)。首先,考虑使用 HOC 在返回传递的组件之前检查权限和身份验证。如果渲染传递的组件,权限/身份验证数据可以作为道具传递。
withUserData = Component =>
const isValidated, userData = checkAuthAndPermissions(); // Modify for your implementation
if (!isValidated) return null;
return <Component userData=userData />
您可以随后包装任何需要使用 HOC 进行身份验证/权限检查的组件,如下所示。如下所示,Apollo 提供了完全跳过查询以查找道具或其他逻辑的机会,如果这是您可能考虑的事情。最后,通过 option prop,您可以设置 fetchPolicy,它可以基于权限检查或 props 动态设置。使用这个 fetchPolicy,如果这是一个目标,您可以避免寻找缓存。
const ComponentWithApollo = graphql(YOUR_QUERY,
skip: props => /* consider permissions/auth here, skip if needed */ ,
options: props =>
const fetchPolicy = determineFetchPolicyFromAuthOrPermissions();
return fetchPolicy ;
,
props: ( data ) => data
)(YourComponent);
withUserData(ComponentWithApollo);
【讨论】:
以上是关于(GraphQL) - 为啥 Apollo 先检查缓存,然后再做其他事情?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Apollo/GraphQL 返回一个不可扩展的对象?
React Native:为啥使用 Apollo 的 GraphQL 查询返回未定义?
为啥将 Apollo 与 Nuxt 一起使用需要 graphql-tag?