首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sangria-graphql:未解析的内联片段

sangria-graphql:未解析的内联片段
EN

Stack Overflow用户
提问于 2017-08-03 20:57:59
回答 1查看 274关注 0票数 0

嘿,所有人。我在用sangria-graphql,一切都很好.除了内联碎片。我在模式中有以下类型:

代码语言:javascript
复制
interface Entity {
  oid: ID!
}
type Dataset implements Entity {
  oid: ID!
  name: String
  ... (other fields)
}
... (other types implementing Entity)
type Issue {
  entity: Entity!
  ... (other fields)
}
type Query {
  validate(many arguments): [Issue!]
  ... (other queries)
}

我发送这样一个查询:

代码语言:javascript
复制
{
  validate(many arguments) {
    entity {
      oid
      ... on Dataset {
        name
      }
    }
}

即使返回的是Dataset实例的oid,也不返回它的名称。这就好像解析器不知道这是Dataset的一个实例,并且只将它作为实体的一个实例来处理。

一些实现细节。模式是使用来自Schema.buildFromAst文档的GraphQL方法构造的,实现了resolveField方法:

代码语言:javascript
复制
import sangria.schema._
import sangria.ast.Document
import play.api.libs.json._

// document is an instance of Document
lazy val schema: Schema[Ctx, Any] =
  Schema.buildFromAst(document, new DefaultAstSchemaBuilder[Ctx] {
    override def resolveField(typeDefinition: TypeDefinition,
                              fieldDefinition: FieldDefinition) =
      typeDefinition.name match {
        case "Mutation" => context =>
          fieldDefinition.name match {
            ... // cases for specific mutations
          }
        case "Query" => context =>
          fieldDefinition.name match {
            case "validate" =>
              ... // implementation that returns a Seq[JsValue],
                  // where the Json values are serializations of Issue
            ... // cases for other queries
          }
        case _ => context =>
          ... // resolve the sub-selection fields as described below
      }
  }

子选择字段解析如下:

  • 如果context.valueJsObject,则取其名称为context.field.name的Json字段;
  • 如果context.valueJsString,那么它被解释为实体的oid,则使用Ctx上下文提供的句柄在存储中查找该实体;该实体被检索为JsObject,其Json字段的名称为context.field.name

正如我提到的,问题是内联片段没有得到尊重。也许,我漏掉了什么。也许,不仅仅是resolveField,还有其他的东西也需要正确地实现。也许,我的resolveField实现有问题。

你有什么建议?在你看来,问题在哪里?你建议我做些什么来解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2017-08-03 23:26:02

由于您使用的是通用JsValue,所以还需要重写DefaultAstSchemaBuilder.objectTypeInstanceCheck。它应该告诉库特定的JsValue是否属于特定的GraphQL类型。例如,如果实体JSON有类似于{"type": "Dataset", ...}的字段,则需要根据提供的ObjectType名称检查它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45494390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档