如何复用OrganizationFields作为GraphQL的ObjectType和InputObjectType?
解决Sangria中ObjectType与InputObjectType同名冲突的问题
这个错误的核心原因是GraphQL要求Schema内所有类型的名称必须唯一,你现在把OrganizationFields同时定义成了查询用的ObjectType和变更用的InputObjectType,同名但类型Kind不同,自然会触发冲突。
最直接也符合GraphQL最佳实践的解决方法是给输入类型重命名(通常给输入类型加Input后缀是行业惯例),具体修改如下:
// 保持查询用的ObjectType名称不变 implicit val OrganizationFields = deriveObjectType[GraphqlContext, OrganizationFields]() // 给输入类型指定新名称,避免冲突 implicit val OrganizationInputType = deriveInputObjectType[OrganizationFields]( InputObjectTypeName("OrganizationFieldsInput") ) // 原Organization的ObjectType定义不变 implicit val OrganizationType: ObjectType[GraphqlContext, Organization] = deriveObjectType[GraphqlContext, Organization]()
之后在你的Mutation定义里,createOrganization字段的organization参数要使用这个重命名后的OrganizationInputType,比如:
val MutationType = ObjectType( "Mutation", fields[GraphqlContext, Unit]( Field( name = "createOrganization", fieldType = OrganizationType, arguments = Argument("organization", OrganizationInputType) :: Nil, resolve = ctx => { // 处理创建逻辑 } ) ) )
这样修改后,Schema里就会有两个不同名称的类型:
OrganizationFields:用于查询返回的对象类型OrganizationFieldsInput:用于变更输入的输入对象类型
完全符合GraphQL的命名规范,也解决了类型名称冲突的问题。
内容的提问来源于stack exchange,提问作者mravey
相关产品推荐
相关产品推荐

