3

我对 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 />组件执行时,会出现错误:

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

我不知道为什么这会被视为“网络错误”。

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

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

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

将错误更改为

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

并从中删除字段conversation,查询运行良好(尽管{}为所有sender/ conversations 返回)。

因为conversation当我有效地跳过错误时,我认为这与联合类型sender无关。sender

我正在针对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"}
4

0 回答 0