从缓存graphql apollo 2.0中读取数据

时间:2018-05-06 07:27:41

标签: graphql apollo react-apollo apollo-client

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

我经历了client.readQueryclient.fragementQuery,但两者都不适用于我的情况bcz client.readQuery期望在服务器之前调用相同的查询,我应该有相同的变量。由于我没有username/password,因此我无法致电client.readQuery。同样,client.fragementQuery期望id为强制性。由于我没有id因此无法使用它。

暂时,我只是从data迭代cache并过滤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 个答案:

答案 0 :(得分:2)

我使用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);