我是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"}