为查询字段Y返回的类型X的对象缺少选择集

时间:2019-07-28 22:39:14

标签: javascript graphql apollo react-apollo graphql-tools

我是GraphQL的新手。我有这样的查询:

 query messages ($assetId: ID!) {
    messages (assetId: $assetId, offset: 0, limit: 3) {
      id
      text
      time
      sender {
        ...on Asset {
          id
          name
        }
        ...on Contact {
          id
          name
        }
      }
      conversation {
        id
      }
    }
  }

当通过react-apollo <Query />组件执行时,会产生错误:

  

网络错误:为查询字段发送者返回的资产类型的对象缺少选择集

我不知道为什么将其视为“网络错误”。

根据this answer,“缺少选择集”是指嵌套对象内部请求的字段,这很有意义,除非我在上面的查询中明确包含类型为“资产”的字段。

删除sender字段,使查询看起来像这样:

 query messages ($assetId: ID!) {
    messages (assetId: $assetId, offset: 0, limit: 3) {
      id
      text
      time
      sender
      conversation {
        id
      }
    }
  }

将错误更改为

  

网络错误:缺少针对查询字段对话返回的对话类型的对象的选择集

并从conversation中删除字段,查询运行正常(尽管对所有{} / sender返回conversation)。

由于当我有效地跳过conversation时错误移至sender,因此我认为这与sender是Union类型无关。

我正在针对具有以下类型的可执行模式(通过makeExectuableSchema)运行此查询:


type Asset {
  id: ID!
  name: String!
}

type Contact {
  id: ID!
  name: String!
}

union ConversationMember = Asset | Contact

type Message {
  id: ID!
  sender: ConversationMember!
  conversation: Conversation!
  time: Time!
  text: String!
}

type Conversation {
  id: ID!
  members: [ConversationMember!]!
  messages: [Message!]!
}

我误解了一些显而易见的东西吗?在这种情况下,我似乎无法解释此错误。

编辑:

我正在使用apollo-boost并按如下方式创建客户端:

export default new ApolloClient({
  cache: new InMemoryCache({
    fragmentMatcher: new IntrospectionFragmentMatcher({
      introspectionQueryResultData: introspectionResult
    })
  }),
  link: new SchemaLink({ schema })
}));

由于union类型需要一个IntrospectionFragmentMatcher,因此我必须对模式进行自省以获取类型。因此,我正在创建这样的缓存:

const query = gql`
  query {
    __schema {
      types {
        kind
        name
        possibleTypes {
          name
        }
      }
    }
  }
`;

...

return new InMemoryCache({
  fragmentMatcher: new IntrospectionFragmentMatcher({
    introspectionQueryResultData: response.data
   })
});

有趣的是,检查模式查询的结果,发现所有内容的__typename"__Type"

{kind: "OBJECT", name: "Query", possibleTypes: null, __typename: "__Type"},
{kind: "OBJECT", name: "Asset", possibleTypes: null, __typename: "__Type"},
{kind: "OBJECT", name: "Contact", possibleTypes: null, __typename: "__Type"},
{kind: "OBJECT", name: "Conversation", possibleTypes: null, __typename: "__Type"},
{kind: "UNION", name: "ConversationMember", possibleTypes: Array(2), __typename: "__Type"},
{kind: "OBJECT", name: "Message", possibleTypes: null, __typename: "__Type"}

0 个答案:

没有答案