为聊天应用程序缓存 apollo 客户端的最佳方式是什么?
What is the best way caching apollo client for chat applications?
当我为聊天应用程序使用 apollo 客户端缓存时,出现逻辑错误。
我去第一个房间缓存显示 10 条消息,当我这次单击另一个房间时,我收到上次访问的房间的消息?
我的缓存
const cache = new InMemoryCache({
typePolicies: {
Query: {
fields: {
lastRooms: offsetLimitPagination(),
lastTopics: offsetLimitPagination(),
topicDetail: offsetLimitPagination(),
// chatDetail: offsetLimitPagination(),
chatDetail: {
keyArgs:['limit'],
merge(existing=[], incoming=[], { readField }) {
try {
let merged = existing
const existingIdSet = new Set(merged.map(message => readField("_id", message)));
if (incoming) {
incoming = incoming.filter(message => !existingIdSet.has(readField("_id", message)))
}
return [...merged, ...incoming]
} catch (error) {
console.log("Apollo Cache chatDetail Query fields Erorr:", error);
}
}
},
}
}
},
});
这是房间
这是第一个房间,只有两条消息
这里是K3房间,有16条留言
是关于keyArgs字段的。
keyArgs字段必须是你要缓存的数据,你应该设置keyArgs字段
例如,如果您的查询参数是(房间、用户...),您应该使用 keyArgs:["room"]
缓存的 baceuse 应该像 roomDetail:
const cache = new InMemoryCache({
typePolicies: {
Query: {
fields: {
lastRooms: offsetLimitPagination(),
lastTopics: offsetLimitPagination(),
topicDetail: offsetLimitPagination(),
chatDetail: {
keyArgs:['room'],
merge(existing=[], incoming=[], { readField }) {
try {
let merged = existing
const existingIdSet = new Set(merged.map(message => readField("_id", message)));
if (incoming) {
incoming = incoming.filter(message => !existingIdSet.has(readField("_id", message)))
}
return [...merged, ...incoming]
} catch (error) {
console.log("Apollo Cache chatDetail Query fields Erorr:", error);
}
}
},
}
}
},
});
当我为聊天应用程序使用 apollo 客户端缓存时,出现逻辑错误。
我去第一个房间缓存显示 10 条消息,当我这次单击另一个房间时,我收到上次访问的房间的消息? 我的缓存
const cache = new InMemoryCache({
typePolicies: {
Query: {
fields: {
lastRooms: offsetLimitPagination(),
lastTopics: offsetLimitPagination(),
topicDetail: offsetLimitPagination(),
// chatDetail: offsetLimitPagination(),
chatDetail: {
keyArgs:['limit'],
merge(existing=[], incoming=[], { readField }) {
try {
let merged = existing
const existingIdSet = new Set(merged.map(message => readField("_id", message)));
if (incoming) {
incoming = incoming.filter(message => !existingIdSet.has(readField("_id", message)))
}
return [...merged, ...incoming]
} catch (error) {
console.log("Apollo Cache chatDetail Query fields Erorr:", error);
}
}
},
}
}
},
});
这是房间
这是第一个房间,只有两条消息
这里是K3房间,有16条留言
是关于keyArgs字段的。 keyArgs字段必须是你要缓存的数据,你应该设置keyArgs字段
例如,如果您的查询参数是(房间、用户...),您应该使用 keyArgs:["room"]
缓存的 baceuse 应该像 roomDetail:
const cache = new InMemoryCache({
typePolicies: {
Query: {
fields: {
lastRooms: offsetLimitPagination(),
lastTopics: offsetLimitPagination(),
topicDetail: offsetLimitPagination(),
chatDetail: {
keyArgs:['room'],
merge(existing=[], incoming=[], { readField }) {
try {
let merged = existing
const existingIdSet = new Set(merged.map(message => readField("_id", message)));
if (incoming) {
incoming = incoming.filter(message => !existingIdSet.has(readField("_id", message)))
}
return [...merged, ...incoming]
} catch (error) {
console.log("Apollo Cache chatDetail Query fields Erorr:", error);
}
}
},
}
}
},
});