web-dev-qa-db-ja.com

キャッシュからデータを読み取るgraphqlapollo 2.0

私はapollo2.0を使用しています。最初に、指定されたユーザー名とパスワードに対してサーバーにauthUsergraphql呼び出しを行います。これにより、jwtトークンが生成され、それに応じてトークンが返されます。ログインに成功すると、Usercacheキー値としてidに格納されていることがわかります。与えられたBuyに対してvalidateSSOSessionを作成する必要があるtokenボタンがあります。 validateSSOSessionの場合、キャッシュからtokenを読み取る必要があります。

client.readQueryclient.fragementQueryを確認しましたが、どちらも私の場合には適用されません。bczclient.readQueryは、以前にサーバーに対して同じクエリが呼び出されたため、同じ変数が必要です。 username/passwordがないので、client.readQueryを呼び出すことができません。同様に、client.fragementQueryidを必須として期待します。 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を照会する別の簡単な方法はありますか?

7
joy

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);
3
proti