从缓存graphql apollo 2.0读取数据

Posted

技术标签:

【中文标题】从缓存graphql apollo 2.0读取数据【英文标题】:read data from cache graphql apollo 2.0 【发布时间】:2018-10-16 06:14:40 【问题描述】:

我正在使用阿波罗 2.0。我首先对给定的用户名和密码进行authUsergraphql 调用服务器,生成jwt 令牌并返回令牌作为响应。我确实看到成功登录后,User 存储在cache 中作为id 键值。 我确实有Buy 按钮,我需要为给定的token 制作validateSSOSession。对于validateSSOSession,我需要从缓存中读取token

我经历了client.readQueryclient.fragementQuery,但两者都不适用于我的案例 bcz client.readQuery 期望之前已向服务器调用相同的查询,我应该有相同的变量。因为我没有username/password,所以我不能打电话给client.readQuery。同样,client.fragementQuery 期望 id 是强制性的。由于我没有id,因此无法使用它。

暂时,我只是从cache 迭代data 并过滤User,如下所示。

const data = client.cache.data.data;
  const users = _.values(data).filter(obj=>(obj.__typename==='User' && obj.token));
  const token = users[0].token;

  // Make graphql call to validate sso
  const  data  = await client.query(
    query: GET_SSO_USER,
    variables:  token 
  );

  const authenticated = data.getSingleSignOnUser.user.userId;

是否有其他简单的方法可以从缓存中查询User 以获得给定条件?

【问题讨论】:

【参考方案1】:

我使用client.readQuery()。请参阅有关 https://www.apollographql.com/docs/react/api/apollo-client.html#ApolloClient.readQuery

的文档
import gql from 'graphql-tag';
import  withApollo  from "react-apollo";

const MY_QUERY = gql`
    query 
      user email
    `;

const MyReactComp = (client) =>
    const someQueryResult = client.readQuery( query: MY_QUERY );
        return someQueryResult.user ? 'hello user' : 'oops';
    

export default withApollo(MyReactComp);

【讨论】:

嘿@proti,你的数据在缓存中是什么样的,以便MY_QUERY 成功?我无法读取数据***.com/questions/61208333/… 谢谢? 常规数据对象。

以上是关于从缓存graphql apollo 2.0读取数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Apollo 缓存中读取特定类型的所有片段

GraphQL/Apollo 客户端:如果查询是先前查询的子集,则从缓存中获取数据

从 apollo 缓存读取查询,查询尚不存在,但所有信息都已存储在缓存中

GraphQL 角度阿波罗客户端。从缓存中读取抛出错误,但对服务器的相同查询工作正常

ReactJS:Apollo graphql 客户端。缓存不在本地更新

如何使用 Apollo Server 2.0 GraphQL 将模式指令中的信息作为返回的数据包含在内?