查询本地缓存中的服务器对象的好方法
Good way to query server object being in local cache
所以我有一个存储用户的数据库。当有人登录我的网站时,它会将用户作为 currentUser 存储在 apollo 缓存中。而我只存储了他的id。
所以我通过传递他的 id 来查询以获取用户:
query {
user(id: "id") {
id
username
avatar
}
}
但每次我想为该用户获取数据时,我需要进行两次查询(第一个在本地从缓存中取回他的 ID,第二个到服务器)。
const GET_CURRENT_USER = gql`
query getCurrentUser {
currentUser @client
}
`;
const GET_USER_DATA = gql`
query getUser($id: String!) {
user(id: $id) {
id
username
avatar
}
}
`;
const currentUserData = useQuery(GET_CURRENT_USER);
const { currentUser } = currentUserData.data;
const { data, loading } = useQuery(GET_USER_DATA, {
variables: { id: currentUser.id },
fetchPolicy: "cache-and-network"
});
有没有一种方法可以将其减少到只有一个查询(对服务器的查询)?
id
存储在缓存中的值可以使用readQuery
读取,你可以将它存储在其他全局store/state,f.e。 redux.
如果您将 apollo 缓存用作全局存储,那么使用查询是此过程的自然组成部分。
使用readQuery
你可以在不查询的情况下读取值(但这样做是一样的)。一个查询 'saved' ;)
更深层次的集成(额外的查询、本地解析器)不是一件好事——创建不必要的依赖关系。
如果你想重用这个 "unneccessary query" 将它提取到某个模块或创建一个 自定义挂钩 (id
read/used/saved 在初始化期间一次) - 可能是这种情况下的最佳解决方案。
另一种解决方案:
使登录过程提供用户数据 - 一些灵感可以看看 apollo-universal-starter-kit - 但这仅适用于初始数据(login/avatar 在会话期间更改??) -进一步的用户查询仍然需要一个 id
参数 - 它必须在应用程序的某处存储和读取。
make id
可选参数(用于 getUser
查询 - 如果您可以更改后端)- 如果未提供,则 return 当前用户的数据(id
读自 session/token)
所以我有一个存储用户的数据库。当有人登录我的网站时,它会将用户作为 currentUser 存储在 apollo 缓存中。而我只存储了他的id。
所以我通过传递他的 id 来查询以获取用户:
query {
user(id: "id") {
id
username
avatar
}
}
但每次我想为该用户获取数据时,我需要进行两次查询(第一个在本地从缓存中取回他的 ID,第二个到服务器)。
const GET_CURRENT_USER = gql`
query getCurrentUser {
currentUser @client
}
`;
const GET_USER_DATA = gql`
query getUser($id: String!) {
user(id: $id) {
id
username
avatar
}
}
`;
const currentUserData = useQuery(GET_CURRENT_USER);
const { currentUser } = currentUserData.data;
const { data, loading } = useQuery(GET_USER_DATA, {
variables: { id: currentUser.id },
fetchPolicy: "cache-and-network"
});
有没有一种方法可以将其减少到只有一个查询(对服务器的查询)?
id
存储在缓存中的值可以使用readQuery
读取,你可以将它存储在其他全局store/state,f.e。 redux.
如果您将 apollo 缓存用作全局存储,那么使用查询是此过程的自然组成部分。
使用readQuery
你可以在不查询的情况下读取值(但这样做是一样的)。一个查询 'saved' ;)
更深层次的集成(额外的查询、本地解析器)不是一件好事——创建不必要的依赖关系。
如果你想重用这个 "unneccessary query" 将它提取到某个模块或创建一个 自定义挂钩 (id
read/used/saved 在初始化期间一次) - 可能是这种情况下的最佳解决方案。
另一种解决方案:
使登录过程提供用户数据 - 一些灵感可以看看 apollo-universal-starter-kit - 但这仅适用于初始数据(login/avatar 在会话期间更改??) -进一步的用户查询仍然需要一个
id
参数 - 它必须在应用程序的某处存储和读取。make
id
可选参数(用于getUser
查询 - 如果您可以更改后端)- 如果未提供,则 return 当前用户的数据(id
读自 session/token)