查询本地缓存中的服务器对象的好方法

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)