如何在Sangria GraphQL中的对象的解析器中了解请求的字段

use*_*677 5 scala graphql sangria

我正在通过Sangria GraphQL(“ org.sangria-graphql” %%“ sangria”%“ 1.0.0-RC5”)构建GrapQL服务器

我不确定通常是否需要它。但是为了提高性能,我想在解决过程中从客户端获取请求的字段。

例如,

如果您要求,

query Query{
  FooObject{
     fieldA
     fieldB
  }
}
Run Code Online (Sandbox Code Playgroud)

您的服务器可能会在FooObject对象解析器中解析

resolve = Ctx => DB.session
  .query("select fieldA, fieldB, FieldC, FieldD from DATA_TABLE")
  .map(entity => DataObject(entity.fieldA, entity.fieldB)  // By ORM Mapper
)
Run Code Online (Sandbox Code Playgroud)

然后,

对象字段可以在FooObject对象的字段解析器中解析

Field("fieldA", type..., resolve = _.fieldA )
Field("fieldB", type..., resolve = _.fieldB )
Field("fieldC", type..., resolve = _.fieldC )
Field("fieldD", type..., resolve = _.fieldD )
Run Code Online (Sandbox Code Playgroud)

然后,您可能会得到graphql结果

{
  data:{
    FooObject:{
      FieldA: "DataA"
      FieldB: "DataB"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想做的是,在对象解析器解析期间,给出如下所示的字段提示。

resolve = Ctx => {
// Seq(FieldA[], FieldB[])
val requestedFields: Seq[Field[ ... ]] = Ctx.[__COLLECT_REQUESTED_FIELDS__]()

// "FieldA, FieldB"
val fetchingFieldInQuery:String = requestedFields.foldRight("")((acc, nextField) => acc + ", nextField" )

DB.session
   .query(s"select ${fetchingFieldInQuery} from DATA_TABLE")
    .map( entity => DataObject(entity.fieldA, entity.fieldB)) // By ORM Mapper
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我找不到某种方法来提取解析器中客户端请求的字段。该Ctx(context)对象在我的调查中很好地显示了该对象与请求无关。我有没有提到一些方法Ctx.[__COLLECT_REQUESTED_FIELDS__]()?

我可以尝试通过每个字段解析器通过选择数据库中的一列来进行查询。但是,如果我已经知道请求的字段,则可以在一个查询中进行查询,并且可以解决很多N+1情况下的问题(因为顶级对象可以将所有嵌套对象带入查询中,所以可能取决于数据库)

我知道目前还没有最佳实践GraphQL。可能存在比我尝试的更好的方法。购买以了解需要哪些字段对处理数据很有帮助。

如果您知道某种方式,请告诉我。

谢谢。

ten*_*shi 4

桑格利亚汽酒提供了多种功能,可以在您所描述的场景中为您提供帮助。

首先是预测: http: //sangria-graphql.org/learn/#projections

当您使用它时,字段将被自动收集并以带有字段名称的树形式作为参数提供给解析函数。文档本身没有示例,因此我建议您检查这些测试,以了解其在实践中的工作原理:https ://github.com/sangria-graphql/sangria/blob/master/src/test/ scala/桑格利亚汽酒/执行/ProjectorSpec.scala

关于N+1查询问题。我建议您查看描述延迟值解析的文档部分:http://sangria-graphql.org/learn/#deferred-value-resolution。我认为它在这方面也可以帮助你。