【问题标题】:How to create nested GraphQL fields with Sangria's `@GraphQLField` annotation如何使用 Sangria 的 `@GraphQLField` 注释创建嵌套的 GraphQL 字段
【发布时间】:2018-05-30 23:43:00
【问题描述】:

我有一个简单的case class MyContext(queries: Query) 提供给架构:sangria.schema.Schema(deriveContextObjectType[MyContext, Query, Unit](_.queries)

MyQueryQuery 的特征

trait MyQuery {
  @GraphQLField
  def item(ctx: Context[MyContext, Unit])(id: String) ... 
}

这很好用。但是如果我想嵌套解析器怎么办?

query { 
   item { 
     status # status is resolved from source B
     price # price is resolved from source C
   }
 }

这有可能实现吗?我会返回一个ObjectType[Item],它的属性statusprice@GraphQLField 注释吗?

【问题讨论】:

    标签: sangria


    【解决方案1】:

    我认为您可以将deriveObjectType 用作Item。它还能够处理@GraphQLField 注释(作为替代方案,您也可以使用IncludeMethods 宏设置)。这是一个例子:

    implicit val ItemType = deriveObjectType[MyContext, Item]()
    

    【讨论】:

      【解决方案2】:

      真的很感谢@tenshi's的回答!我尝试使用deriveObjectType,但出现类型错误:

      type mismatch;
       found   : sangria.schema.Context[MyContext,Item]
       required: sangria.schema.Context[MyContext,Unit]
      

      但是将deriveContextObjectTypeAddFields 结合使用是有效的:

      def schema = sangria.schema.Schema(
          deriveContextObjectType[MyContext, Query, Unit](_.queries,
            AddFields(
              Field(
                name = "item",
                fieldType = deriveContextObjectType[MyContext, Item, Unit](_ => new Item),
                resolve = _ => ()
              )
            ))
          )
      

      而且 Schema 看起来不错,产生:

      type Query {
        item: Item!
      }
      

      【讨论】:

        猜你喜欢
        • 2020-08-19
        • 2018-03-15
        • 2019-05-25
        • 2013-08-19
        • 1970-01-01
        • 2017-06-24
        • 2021-10-09
        • 2011-03-23
        • 1970-01-01
        相关资源
        最近更新 更多