Apollo-boost 缓存问题
Posted
技术标签:
【中文标题】Apollo-boost 缓存问题【英文标题】:Apollo-boost caching issue 【发布时间】:2019-02-20 02:34:44 【问题描述】:我遇到了 apollo 客户端缓存的问题,我不确定我是否理解原因。我正在使用 apollo-boost 构建一个 angular 6 应用程序,一切运行良好。我现在有一个场景,其中我的 graphql 查询需要一个 id(用户的)和一个过滤器字符串(用于过滤后端的记录)。角度组件代码如下:
ngOnInit()
this.filter$.subscribe(filterValue =>
this.route.params.subscribe(this.getAppointments.bind(this, filterValue));
);
getAppointments
函数如下所示:
getAppointments(filter: string, params: id: string)
this.artistAppointmentBookGQL.watch(artistId: user.artist._id, filter).valueChanges
.pipe(
map(results =>
// THIS ALWAYS RUNS WHEN THE FILTER CHANGES
// HOWEVER THE RESULTS ARE ALWAYS THE LAST QUERY RUN
// IF THE FILTER HAS BEEN RUN BEFORE
console.log(user.artist._id, filter, results.data.artist.appointmentBook);
return results.data.artist.appointmentBook;
));
graphql 查询:
query artistAppointmentBook($artistId: ID!, $filter: String)
artist(id: $artistId, appointmentType: $filter)
_id
appointmentBook
_id
created_at
firstName
lastName
date
price
stripe
charge
id
amount
主要问题:
我有 4 种不同的可能过滤器值(全部、未确认、已确认、已付费)。当我使用每个过滤器值运行这些查询时,它按预期工作,并且我从 apollo 服务器获取正确的结果集。但是,一旦我两次运行相同的查询,我只能返回最后一次查询的结果,并且没有进行网络调用,大概是因为它使用的是缓存版本。
缓存不应该基于变量输入吗?当我第一次使用不同的变量运行时,它似乎运行良好,但是一旦一个被复制,我只会得到最后一次调用产生的任何东西。感谢您的帮助!
这个 gif 演示了这个问题:
【问题讨论】:
【参考方案1】:解决了我的问题。理所当然,apollo 正在缓存艺术家记录,因为它有一个 _id 和一个类型。过滤器被传递到艺术家查询中,而它本应在 appointmentBook
级别传递。我更新了架构以接受过滤器参数,然后将其传递到那里而不是艺术家查询中。
原来我有:
query artistAppointmentBook($artistId: ID!, $filter: String)
artist(id: $artistId, appointmentType: $filter)
_id
appointmentBook
_id
created_at
firstName
lastName
date
price
stripe
charge
id
amount
需要改成:
query artistAppointmentBook($artistId: ID!, $filter: String)
artist(id: $artistId)
_id
appointmentBook(filter: $filter)
_id
created_at
firstName
lastName
date
price
stripe
charge
id
amount
此次更新后,查询被正确缓存。
【讨论】:
以上是关于Apollo-boost 缓存问题的主要内容,如果未能解决你的问题,请参考以下文章
禁用从 apollo-boost 导出的 ApolloClient 中的缓存
ReferenceError:从“apollo-boost”导入 ApolloClient 时未定义要求
来自 apollo-boost 的 ApolloClient 试图分配给只读属性