我们正在使用Apollo GraphQL开发API。我们使用Apollo提供的即用型缓存解决方案(使用Redis数据存储的KeyValueCache
)。
当请求查询到达时,为什么ApolloServer在执行其他任何操作之前先检查缓存?
在触摸缓存之前,有什么方法可以插入逻辑吗?例如,我们想在Apollo检查缓存之前进行一些身份验证和权限检查。
(是的,有一些指令,但是我们发现Public/Private
的范围和maxAge
不足以满足我们的需求。)
答案 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);