【问题标题】:(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);