(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?

为啥我的 graphql apollo 解析器没有被调用?

为啥 apollo-client 的 GraphQL 查询不出现在 Chrome 的 XHR 网络过滤器中?

为啥使用 Apollo GraphQL Server Express(或其他集成)?