我在生产中使用Apollo已有大约一年的时间,并且我正在尝试优化缓存管理。 让我们想象一下以下虚拟的简单模式:
type Query {
allBooks: [Book]
allCups: [Cup]
allColors: [Color]
}
type Book {
id: Int
name: String
cover_color_id: Int
CoverColor: Color
}
type Cup {
id: Int
name: String
cover_color_id: Int
CoverColor: Color
}
type Color {
id: Int
name: String
hex_code: String
}
我想配置cacheRedirects,以便当我需要Book.CoverColor或Cup.CoverColor(例如,通过allBooks)时;它将首先在缓存中查找具有匹配ID的颜色,然后再向服务器询问。 有可能吗?
谢谢!
PS:我尝试过这种方法,但似乎不起作用:
cacheRedirects: {
Query: {
// Stuff that perfectly works
},
Book: {
// this is not even executed :(
CoverColor: (book, args, { getCacheKey }) => {
return getCacheKey({
__typename: 'Color',
id: book.cover_color_id
})
}
}
}
答案 0 :(得分:0)
这取决于您的查询的外观。
如果您的allBooks
重定向返回ID列表,并且您的查询启用了returnPartialData
,则它应该可以工作。
如果您在查询allBooks
时未遇到重定向,则阿波罗没有理由在[Book]
的每个元素(如果已经具有所有数据)上使用缓存的字段
对一本书进行查询,它应该可以按预期工作。
type Query {
allBooks: [Book]
allCups: [Cup]
allColors: [Color]
book(id: Int): Book
}
const cacheRedirects: CacheResolverMap = {
Query: {
book: (_, args, { getCacheKey }) =>
getCacheKey({ __typename: 'Book', id: `${args.id}` }),
},
Book: {
CoverColor: (book, args, { getCacheKey }) => {
return getCacheKey({
__typename: 'Color',
id: book.cover_color_id,
})
},
},
}