【问题标题】:(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 不足以满足我们的需求。)

【问题讨论】:

    标签: javascript graphql apollo apollo-client apollo-server


    【解决方案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);
    
    

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 1970-01-01
      • 2018-06-03
      • 2020-11-26
      • 2023-03-26
      • 1970-01-01
      • 2020-10-15
      • 2011-08-14
      • 2011-05-24
      相关资源
      最近更新 更多