Apollo GraphQL - 如何从缓存存储中获取突变记录的数据?

时间:2018-02-04 14:11:10

标签: javascript react-native graphql react-apollo apollo-client

我正在使用React-Native开发一个应用程序,并在服务器端使用GraphQL作为REST。我的应用程序中有身份验证层,我希望从服务器上获取从变异查询中获取的数据。

这是传递给props的signIn方法:

const login = graphql(LoginMutation, {
    props: ({ mutate }) => ({
        login: (user) =>
            mutate({
                variables: { email: user.email, password: user.password },
                refetchQueries: [{ query: fetchShop }],
                update: (proxy, { data: { signIn } }) => {

                    console.log("USSER : " + JSON.stringify(signIn))

                    const query = gql`
                        {
                            currentUser {
                                id
                                email
                                jwt
                                __typename
                            }
                        }
                    `;
                    try {
                        proxy.writeQuery({ query: query, data: signIn })
                    } catch (error) {
                        console.log("Error occured due to the followig error at write query : "+error)
                    }

                    //data.user.push(mutationResult.signIn);
                    //proxy.writeQuery({query,data})
                }
            }),
    }),
});

这是我的signIn变异:

import gql from 'graphql-tag';

export default gql`
mutation SignIn($email : String!,$password : String!){
    signIn(email : $email, password : $password){
        id
        email
        name
        jwt
    }
}
`;

我在React-Native库的AsyncStorage中保存身份验证令牌。我想要做的是从商店获取userInformation。从缓存存储中读取根查询没有任何问题。

我深入研究了Apollo-client提供的客户端道具。我可以看到里面的用户数据。它位于商店下面的一些名为ROOT_MUTATION的房产下。 (我可以分享道具数据)

我正在使用readQuery,但它会在{“id”:“......”,“电子邮件”:“asdasds”,“name”:“ajdasdasd”,“jwt”中发出“在currentUser中丢失字段”的警告:令牌

它仍然没有将currentUser查询插入到props.client的ROOT_QUERIES中。

您对如何实现这一目标有所了解吗?

1 个答案:

答案 0 :(得分:1)

最后,我实现了我的目标。这里使用的方法是:

第一种方法是signIn变异:



const login = graphql(LoginMutation, {
    props: ({ mutate }) => ({
        login: (user) =>
            mutate({
                variables: { email: user.email, password: user.password },
                refetchQueries: [{ query: fetchShop }],
                update: (proxy, { data: { signIn } }) => {

                    console.log("USSER : " + JSON.stringify(signIn))

                    const query = gql`     {                 
                            user{
                                id
                                email
                                jwt
                                __typename
                            }
                        }
                    `;
                    proxy.writeQuery({query : query , data : {user : signIn}})
                }
            }),
    }),
});




代码中的某个地方;您可以通过以下方式从商店(本例中的用户)中读取数据:



const { client } = this.props;
        console.log(client.store);

        try {
            const { user } = client.readQuery({
                query: gql`
                {
                    user{
                        id
                        email
                        name
                        __typename
                    }
                }
                `
            })
            console.log("User : "+JSON.stringify(user))
        
        } catch (error) {
            console.log("Error occured at reading user from the cache due to the following err : " + error);
        }