Как узнать запрошенные поля в резольвере Object в Sangria GraphQL

Я создаю сервер GrapQL с помощью Sangria GraphQL("org.sangria-graphql" %% "sangria" % "1.0.0-RC5")

Я не уверен, что это необходимо в нормальном режиме. Но для повышения производительности я хотел бы получить запрашиваемые поля от клиента во время разрешения.

Например,

Если вы запросите это,

query Query{
  FooObject{
     fieldA
     fieldB
  }
}

Ваш сервер может разрешиться в распознавателе объектов FooObject

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

затем,

Поле объекта может быть разрешено в резольвере поля объекта FooObject.

Field("fieldA", type..., resolve = _.fieldA )
Field("fieldB", type..., resolve = _.fieldB )
Field("fieldC", type..., resolve = _.fieldC )
Field("fieldD", type..., resolve = _.fieldD )

Затем вы можете получить результат graphql

{
  data:{
    FooObject:{
      FieldA: "DataA"
      FieldB: "DataB"
    }
  }
}

То, что я пытаюсь сделать, во время разрешения в Object resolver, дать подсказки поля, как показано ниже.

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
}

В этом случае я не мог найти, как извлечь те поля, которые запрашивал клиент в resolver. Ctx(context) объект показывает, что объект не о запросе хорошо в моем исследовании. Есть какой-то метод, как я уже говорил, как Ctx.[__COLLECT_REQUESTED_FIELDS__]()?

Я могу попробовать это по каждому полю решатель сделать запрос, выбрав один столбец в базе данных. Но если бы я мог уже знать, какие поля запрашиваются, я мог бы сделать это в одном запросе, и это могло бы решить много N+1 проблема случая (поскольку объект верхнего уровня может принести все вложенные объекты в запросе, это может зависеть от базы данных)

Я знал, что нет лучшей практики для GraphQL еще. Возможно, лучший способ существует, чем я пытаюсь. Купить, чтобы узнать, какие поля запрашиваются, хорошо для обработки данных.

Если вы знаете как-нибудь, дайте мне знать.

Спасибо.

1 ответ

Sangria предоставляет несколько функций, которые могут помочь вам в описанных вами сценариях.

Во-первых, это прогнозы: http://sangria-graphql.org/learn/

Когда вы используете его, поля будут автоматически собраны и предоставлены для разрешения функции в качестве аргумента в виде дерева с именами полей. В самой документации нет примеров, поэтому я бы посоветовал вам проверить эти тесты, чтобы увидеть, как они работают на практике: https://github.com/sangria-graphql/sangria/blob/master/src/test/scala/sangria/execution/ProjectorSpec.scala

По поводу вопроса N+1. Я бы посоветовал вам ознакомиться с разделом документации, в котором описано разрешение отложенных значений: http://sangria-graphql.org/learn/. Я думаю, что это может помочь вам и в этом отношении.

Другие вопросы по тегам