我对 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
/ conversation
s 返回)。
因为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"}