(GraphQL)-为什么Apollo在执行其他操作之前先检查缓存?

时间:2019-09-13 18:45:22

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

我们正在使用Apollo GraphQL开发API。我们使用Apollo提供的即用型缓存解决方案(使用Redis数据存储的KeyValueCache)。

当请求查询到达时,为什么ApolloServer在执行其他任何操作之前先检查缓存?

在触摸缓存之前,有什么方法可以插入逻辑吗?例如,我们想在Apollo检查缓存之前进行一些身份验证和权限检查。

(是的,有一些指令,但是我们发现Public/Private的范围和maxAge不足以满足我们的需求。)

1 个答案:

答案 0 :(得分:0)

下面的代码和解释为您探索了几种不同的方法-希望一种方法可以满足您的需求(我假设您知道您可以控制Apollo是否首先通过fetchPolicy进行缓存-尽管我在讨论下面简要介绍一下)。首先,考虑使用HOC在返回传递的组件之前检查权限和身份验证。如果呈现了传递的组件,则可以将权限/身份验证数据作为道具传递。

withUserData = Component => {
  const { isValidated, userData } = checkAuthAndPermissions(); // Modify for your implementation 
  if (!isValidated) return null;
  return <Component userData={userData} />
}

此后,您可以使用HOC包装需要进行身份验证/权限检查的任何组件,如下所示。如下所示,如果您可以考虑,Apollo还提供了跳过查询以寻求支持或其他逻辑的机会。最后,通过选项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);