【发布时间】:2018-05-03 18:41:42
【问题描述】:
我正在尝试通过schema stitching 使我的 GraphQL 架构可组合,但我正在努力解决如何从不同部分解析类型的属性。
这是分解前的架构:
type Referee {
id: ID!
stringProp: String!
}
type Referer {
id: ID!
pointer: Referee!
}
type Query {
referers: [Referer]
}
这两种类型都有解析器,在它们各自的架构中,将对象 { id } 扩展为 { id, stringProp } 或 { id, pointer: { id } },以便进行查询
query FromSingleSchema {
referers: {
id
pointer {
id
stringProp
}
}
}
按预期解决; Query.referers 解析为 [{id}] 对象列表,每个对象依次首先解析为 Referer,然后通过类型解析器获取指向的 Referee。
现在,我尝试分解架构:
// schema A
type Referee {
id: ID!
stringProp: String!
}
// schema B
type Referer {
id: ID!
}
type Query {
referers: [Referer]
}
// schema Extensions
extend type Referer {
pointer: Referee!
}
然后重新组合:
// both schemaA and schemaB have been created with makeExecutableSchema
import schemaA from './A'
import schemaB from './B'
// schemaExtensions is just a raw GraphQL string
// resolverExtensions is shown below
import { schemaExtensions, resolverExtensions } from './B'
const schema = mergeSchemas({
schemas: [schemaA, schemaB, schemaExtensions],
resolvers: Object.assign({}, resolverExtensions)
})
// resolverExtensions defined as follows:
{
Referer: {
pointer: {
fragment: 'fragment IdFragment on Referee { id }',
resolve: o => ({ id: o.pointerId })
}
}
}
有了这个,我可以毫无问题地运行这个查询:
query OnlyIdFromDecomposedSchemas {
referers: {
id
pointer {
id
}
}
}
但这失败了
query FullRefereeFromDecomposedSchemas {
referers: {
id
pointer {
id
stringProp
}
}
}
带有错误信息
不能为非空字段Refeeee.stringProp返回null。
Referee 的类型解析器需要做什么才能在 { id } 可用时填充其余属性,就像在单个未分解的架构中一样?
【问题讨论】:
标签: graphql apollo apollo-server