变异后无法更新graphQL缓存

时间:2018-04-05 13:40:40

标签: caching graphql apollo-client

我在节点js(没有React)上使用apollo-client来存储,获取和更新数据。像以下一样创建客户端:

const { ApolloClient } = require('apollo-client');
const { InMemoryCache } = require('apollo-cache-inmemory');
const { SchemaLink } = require('apollo-link-schema');

const gqlClient = new ApolloClient({
  addTypename: false,
  ssrMode: true,
  cache: new InMemoryCache({
  }),
  link: new SchemaLink({ schema }),
});

使用graphql-tag包进行查询:

const gql = require('graphql-tag');

mylicense = gql`
  query Licenses($userId: String!){
    myLicense(userId:$userId) {
      license{
        value
      }
    }
  }
`;

getLicense = gql`
  query Licenses($id: ID!){
    license(_id:$id) {
      _id,
      name,
      value
    }
  }
`,

updateLicense = gql`
  mutation updateLicense($id: ID!, $name: String, $value: String){
    updateLicense(_id:$id, name: $name, value: $value) {
      _id,
      name,
      value
    }
  }
`,

我这样调用更新(是的,我从REST请求中获取数据,但现在不重要):

const options = {
  mutation: updateLicense, 
  variables,
  // update or refetchQueries tried here
};
return gqlClient.mutate(options)
  .then(result => res.json({ data: result.data.updateLicense }))
  .catch(next);

我们在这里,不知何故,我需要使用variables值更新缓存,因为mylicense路由不会返回新值。

gqlClient.query({ query: mylicense, { userId: 'anything' } })

我读了很多documentations,例如update选项:

const update = (proxy, { data: { updateLicense } }) => {
  const data = proxy.readQuery({
    query: mylicense,
    variables: { userId: req.params.id },
  });
  data.updateLicense.push(updateLicense);
  proxy.writeQuery({ query: license.get, data, variables });
};

它在proxy.readQuery行上删除了一个错误:Can't find field mylicense({"userId":"..."}) on object (ROOT_QUERY)

另一个选项是refetchQueries,应该更简单,至少不会丢失错误,但是没有做任何事情:

const refetchQueries = [
  { query: mylicense},
  // or
  'myLicense'
  // or 
  { query: mylicense, variables: { userId: variables.id } },
];

我尝试使用不同的设置制作客户端:

const gqlClient = new ApolloClient({
  addTypename: false,
  ssrMode: true,
  cache: new InMemoryCache({
    dataIdFromObject: ({ id }) => id || null,
    addTypename: false,
  }),
  dataIdFromObject: ({ id }) => id || null,
  link: new SchemaLink({ schema }),
});

仍然没有。

我真的想出了我的所有想法。正如我所见,graphQL主要用于React,也许我的问题是节点js具体,我不知道......

任何想法都表示赞赏!

0 个答案:

没有答案