尽管未使用接口或联合,但readFragment导致IntrospectionFragmentMatcher错误

时间:2019-03-22 10:33:01

标签: javascript reactjs apollo react-apollo apollo-client

尝试获取查询片段时出现以下错误:

  

“您正在使用简单的(启发式)片段匹配器,但是您的查询包含联合或接口类型。ApolloClient将无法准确映射片段。要使此错误消失,请使用IntrospectionFragmentMatcher作为在文档中进行了描述:https://www.apollographql.com/docs/react/recipes/fragment-matching.html

这是触发错误的调用。

const sourceData = cache.readFragment({
        id: `${typename}:${idToAdd}`,
        fragment: gql`
          ${sourceFragment}
        `,
      });

sourceFragment在哪里

fragment series on PriceSeries {
    id
    title
    description
    commodity
    region
    location
    isDiscontinued
    order
}

Apollo似乎将片段的返回值归类为并集或接口。我认为没有必要添加IntrospectionFragmentMatcher,因为我们不需要联合或接口,尽管也许我错了。将__typename添加到片段没有帮助。

  • 如何消除此错误(我可能只是缺少某些gql语法以进行输入?)
  • 是否使用片段意味着无论如何都应设置IntrospectionFragmentMatcher。(文档说应该只需要when using fragments on interfaces or unions,而我们不需要)
  • 该错误是一个错误,我是否应该隐藏该错误(如果您忽略它,它确实可以正常工作)

更新

ApolloClient的创建如下

 client = new ApolloClient({
      link: createLink('MY_URL', Apollo.fetch),
      cache: new InMemoryCache(),
    });

1 个答案:

答案 0 :(得分:0)

您需要创建阿波罗缓存并使用dataIdFromObject设置规范化功能。

import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';

const fragmentMatcher = new IntrospectionFragmentMatcher({
  // Here you may want to pass your introspection query result data,
});

const cache = new InMemoryCache({
  dataIdFromObject: o => o.id,
  fragmentMatcher,
});