我使用的是graphql_flutter包,但似乎存在缓存问题。即使FetchPolicy
设置为noCache
,客户端也会将缓存的数据从一个用户传递给另一个用户。
我在下面概述了我的graphql客户端设置,然后介绍了我用于向服务器发送查询的自定义方法(它获取用户喜欢的项目(。我已经查看了官方文档中的政策,相信我的设置是正确的。问题(以及复制步骤(如下:
- 我使用测试用户帐户登录我的应用程序(使用Amplify Cognito用于身份验证(,并将一些项目添加到用户的收藏夹列表中(使用突变请求(
- 然后我导航到"收藏夹"摘要页面,其中我调用下面概述的
fetchFavoritesData
方法来获取用户喜爱的所有项目。工作起来很有魅力 - 然后,我注销并创建一个全新的用户帐户,并使用该新用户登录(即不同访问令牌和所有(
- 在将任何项目添加到该新用户的收藏夹列表之前,如果我检查他们的"收藏夹"摘要页面,该页面调用
fetchFavoritesData
方法并应返回null(因为该用户尚未添加任何项目(,则结果实际上会返回第一个用户喜欢的确切项目。奇怪
一直在玩策略,尝试了不同的获取策略等等,但问题仍然存在。我是不是遗漏了什么(对不起,这个包是全新的(,或者这可能是一个bug?
GraphQLClient client = GraphQLClient(
link: link,
cache: GraphQLCache(), // declared cache here because I'm using the client for a few different requests, some where caching is preferred.
);
}
Future<void> fetchFavoritesData() async {
final QueryOptions options = QueryOptions(
document: gql(queryFavoritesData),
// only return result from network
fetchPolicy: FetchPolicy.noCache,
// ignore cache data if any
cacheRereadPolicy: CacheRereadPolicy.ignoreAll,
);
final QueryResult result = await GraphQLConfiguration.client.query(options);
}
2021年8月26日更新:
我已经迁移到Firebase进行身份验证,错误不再发生。不确定身份验证包是因果关系还是只是相关性,但这不再是问题。
身份验证不是问题所在您可以通过如下初始化客户端来更改默认策略:
client = GraphQLClient(
link: HttpLink(
GqlConstants.gql_endpoint,
defaultHeaders: header,
),
defaultPolicies: DefaultPolicies(
query: Policies(
cacheReread: CacheRereadPolicy.ignoreAll,
fetch: FetchPolicy.noCache,
),
),
cache: GraphQLCache(store: InMemoryStore()),
);
因此,通过此代码,您可以一次性自定义策略。但你也可以通过以下方式对单个查询进行查询:
QueryResult result = await client.query(
QueryOptions(
...
fetch: FetchPolicy.noCache,
),
);